﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://community.devexpress.com/feed-stylesheets/rss.xsl" media="screen"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dx="https://www.devexpress.com/" xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>Mark Miller on CodeRush &amp; IDE Productivity</title>
    <link>https://community.devexpress.com/Blogs/markmiller/default.aspx</link>
    <description>Refactoring for C#, Visual Basic, and XAML, with the fastest test .NET runner available, next generation debugging, and the most efficient coding experience on the planet that exploit the Roslyn engine in Visual Studio 2015, 2017, 2019, 2022.</description>
    <language>en-US</language>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388269</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2026/02/26/new-aigen-functionality-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/AI+Agents">AI Agents</category>
      <category domain="https://community.devexpress.com/Tags/AiGen">AiGen</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush+for+Roslyn">CodeRush for Roslyn</category>
      <category domain="https://community.devexpress.com/Tags/GitHub+Copilot+Chat">GitHub Copilot Chat</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Commands">Voice Commands</category>
      <title>New AiGen Functionality in CodeRush for Visual Studio</title>
      <description>&lt;p&gt;&lt;span style="font-family:&amp;#39;Open Sans Condensed&amp;#39;, HelveticaNeue-CondensedBold, Helvetica, &amp;#39;Arial Narrow&amp;#39;, Calibri, Arial, &amp;#39;Lucida Grande&amp;#39;, sans-serif;font-size:30px;"&gt;CodeRush&amp;#39;s AiGen is Faster and Smarter for Everyday Development&lt;/span&gt;&lt;/p&gt;&lt;div&gt;AI-assisted coding tools live or die by two factors: speed and quality of the code response. If an AI response takes too long, or if it regenerates more code than necessary, developers won&amp;#39;t use it for small, focused changes.&lt;/div&gt;&lt;div&gt;With this release, CodeRush’s AiGen takes significant leaps forward on both fronts. The improvements are all about making AI genuinely fast and useful during day-to-day development -- where precision, latency, and context matter most.&lt;/div&gt;&lt;div&gt;We&amp;#39;ll cover what’s new in this release using real world examples that you can easily try yourself (clone the &lt;a href="https://github.com/MillerMark/CodeRush.AiGen.Samples" target="_blank"&gt;sample project&lt;/a&gt;).&lt;/div&gt;&lt;h2&gt;Improved Context Acquisition &amp;amp; Architectural Awareness&lt;/h2&gt;&lt;div&gt;One of the challenges for AI coding assistants is how to get sufficient&amp;nbsp;context for a correct code response, without exceeding the model&amp;#39;s context window limits. Some&amp;nbsp;AI tools&amp;nbsp;solve this by placing&amp;nbsp;the burden of specifying this additional context -- the files to include in a query -- on the user. This can get tedious when many files are involved. Simple AI tooling&amp;nbsp;might see the file you’re editing, but miss surrounding architectural relationships&amp;nbsp;-- interfaces, implementors, ancestors, descendants, helper classes, and corresponding test fixtures.&lt;/div&gt;&lt;div&gt;To meet this challenge, AiGen now starts each request with a lightweight context-acquisition pass which:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Identifies which related types matter for the request&lt;/li&gt;&lt;li&gt;&lt;div&gt;Traverses the solution hierarchy as needed&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Optimally packs a reasonable portion of the context window with only the most relevant information&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Sends that optimized and packed context to the reasoning model&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The result is higher quality code -- without you having to name (or worry about missing) related types to submit to the model explicitly.&lt;/div&gt;&lt;h3&gt;Example: Consolidating Validation Logic Using the Type Hierarchy&lt;/h3&gt;&lt;div&gt;In the &lt;a href="https://github.com/MillerMark/CodeRush.AiGen.Samples" target="_blank"&gt;sample project&lt;/a&gt;, open the &lt;strong&gt;ContextAcquisition &lt;/strong&gt;folder and navigate to &lt;strong&gt;OrderValidator.cs&lt;/strong&gt;.&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/SolutionExplorer.c.png" alt="" style="width:235px;height:387px;"&gt;&lt;div&gt;Inside the &lt;code class="language-csharp"&gt;ValidateCore()&lt;/code&gt; method, you’ll see some validation logic.&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;protected override void ValidateCore(Order order, ValidationResult result) {
    if (order is null) {
        result.Add(&amp;quot;Order is required.&amp;quot;);
        return;
    }

    // TODO: Ask AiGen to consolidate this based on what we have in the base class.

    var customer = order.Customer;

    if (customer is null) {
        result.Add(&amp;quot;Customer is required.&amp;quot;);
        if (StopOnFirstError) return;
    }

    if (customer?.BillingAddress is null) {
        result.Add(&amp;quot;Billing address is required.&amp;quot;);
        if (StopOnFirstError) return;
    }

    if (string.IsNullOrWhiteSpace(customer?.BillingAddress?.CountryCode)) {
        result.Add(&amp;quot;Billing address country is required.&amp;quot;);
        if (StopOnFirstError) return;
    }

    if (string.IsNullOrWhiteSpace(order.OrderId)) {
        result.Add(&amp;quot;OrderId is required.&amp;quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;This logic duplicates some of the behavior already implemented in the ancestor class (&lt;code class="language-csharp"&gt;BaseValidator&amp;lt;T&amp;gt;&lt;/code&gt;&amp;nbsp;-- check out its&amp;nbsp;&lt;code class="language-csharp"&gt;RequireCustomer()&lt;/code&gt; method).&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;// Shared helpers that derived validators can (and should) reuse.
protected void RequireCustomer(Customer? customer, ValidationResult result) {
    if (customer is null) {
        result.Add(&amp;quot;Customer is required.&amp;quot;);
        if (StopOnFirstError)
            return;
    }

    if (customer?.BillingAddress is null) {
        result.Add(&amp;quot;Billing address is required.&amp;quot;);
        if (StopOnFirstError)
            return;
    }

    if (string.IsNullOrWhiteSpace(customer?.BillingAddress?.CountryCode)) {
        result.Add(&amp;quot;Billing address country is required.&amp;quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;This kind of duplication can happen in systems that evolve over time.&lt;/div&gt;&lt;div&gt;Back in &lt;strong&gt;OrderValidator.cs&lt;/strong&gt;, place your caret inside the&amp;nbsp;&lt;span&gt;&lt;code class="language-csharp"&gt;ValidateCore()&lt;/code&gt;&lt;/span&gt;method,&amp;nbsp;&lt;span&gt;Rather than telling AiGen exactly how to fix it, we can talk to it the way we might speak&amp;nbsp;to a human teammate.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Invoke AiGen (&lt;strong&gt;double-tap&lt;/strong&gt; and &lt;strong&gt;hold &lt;/strong&gt;the &lt;strong&gt;right&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Ctrl &lt;/strong&gt;key if speaking or press &lt;strong&gt;Caps&lt;/strong&gt;+&lt;strong&gt;G&lt;/strong&gt;&amp;nbsp;if you prefer to type -- see &lt;a href="http://int.devexpress.com/community/blogs/markmiller/archive/2025/09/09/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx" target="_blank"&gt;AiGen setup&lt;/a&gt; for more details). Then say something like (one of the following):&lt;/p&gt;&lt;p style="margin-left:40px;"&gt;&lt;em&gt;“Consolidate this logic with what we already have in the base class.”&lt;/em&gt;&lt;/p&gt;&lt;p style="margin-left:40px;"&gt;&lt;em&gt;“Take a look at the ancestor class and see if we can reuse any of that code here.”&lt;/em&gt;&lt;/p&gt;&lt;div&gt;Notice, the prompts are void of symbol or file names. They&amp;#39;re&amp;nbsp;just expressions of intent.&lt;/div&gt;&lt;div&gt;AiGen uses the hierarchy to discover the relevant base class, identifies the overlapping logic, and refactors the code so the shared behavior lives where it belongs -- in the base class -- while keeping &lt;code class="language-csharp"&gt;order&lt;/code&gt;-specific checks local.&lt;/div&gt;&lt;p&gt;After applying this change, the AiGen Navigator will appear. You can click the &amp;quot;&lt;strong&gt;Show Difference&amp;nbsp;View&lt;/strong&gt;&amp;quot; button to see the &lt;strong&gt;before &lt;/strong&gt;and &lt;strong&gt;after &lt;/strong&gt;for the changes applied to this method:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/CodeConsolidation.png" alt=""&gt;”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Here, AiGen  consolidates the duplicated validation logic into a single call to &lt;code&gt;RequireCustomer()&lt;/code&gt;, while maintaining the existing &lt;code&gt;StopOnFirstError&lt;/code&gt;&amp;nbsp;behavior.&lt;/p&gt;&lt;div&gt;The AiGen navigator&amp;#39;s status bar shows total in/out token counts for &lt;span&gt;both&amp;nbsp;&lt;/span&gt;the initial context pass (&amp;quot;&lt;strong&gt;Ctx in/out&lt;/strong&gt;&amp;quot;), and the main reasoning model (&amp;quot;&lt;strong&gt;Reasoning in/out&lt;/strong&gt;&amp;quot;). &lt;strong&gt;Output token&amp;nbsp;counts &lt;/strong&gt;are &lt;strong&gt;low&lt;/strong&gt;, as they should be (only &lt;strong&gt;67 &lt;/strong&gt;&lt;strong&gt;output tokens&lt;/strong&gt;&amp;nbsp;were used by the reasoning model to produce the minimal, targeted change shown&amp;nbsp;in the screenshot). Output tokens typically cost &lt;strong&gt;four&amp;nbsp;times more&lt;/strong&gt; than input tokens, so we want to keep the output token count low, The status bar also shows estimated cost (about 3 cents) and how long it took from request to &lt;strong&gt;integrated response &lt;/strong&gt;(&lt;strong&gt;2.5 seconds&lt;/strong&gt;, in this example). If you&amp;#39;re interested to see how CodeRush stacks up against competing AI tooling solutions,&amp;nbsp;&lt;span&gt;note the AiGen completion time in the status bar,&amp;nbsp;&lt;/span&gt;undo this last change and try the same prompt on the same code in any other competing AI coding assistance tool.&lt;/div&gt;&lt;h2&gt;Speed Where It Matters: Fine-grained Deltas&lt;/h2&gt;&lt;div&gt;Most AI coding assistants treat every change the same way: they regenerate large chunks of code, even when only a few lines actually need to change. This approach can break down quickly in real projects -- especially when methods are large and the requested change is small. With most AI tooling it just doesn&amp;#39;t make sense to ask AI for &lt;strong&gt;small changes &lt;/strong&gt;when you&amp;#39;ll have to wait for an entire method or even a type to be regenerated.&lt;/div&gt;&lt;div&gt;CodeRush&amp;#39;s AiGen takes a different approach.&lt;/div&gt;&lt;div&gt;Instead of regenerating entire members, AI works to&amp;nbsp;produce&amp;nbsp;only the &lt;strong&gt;smallest&amp;nbsp;deltas&amp;nbsp;&lt;/strong&gt;to support fast surgical code&amp;nbsp;&lt;span&gt;integrations&amp;nbsp;without manual copy/paste&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;This impacts:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Speed — generating fewer output tokens (to support the fine grained delta)&amp;nbsp;is faster than regenerating all the code that doesn&amp;#39;t change.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Cost — output tokens are significantly more expensive than input tokens.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Precision — small, focused changes reduce churn and unintended side effects.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h3&gt;Example: Small Business Rule Change Inside a Large Method&lt;/h3&gt;&lt;div&gt;&lt;span&gt;In the&amp;nbsp;&lt;/span&gt;&lt;a href="https://github.com/MillerMark/CodeRush.AiGen.Samples" target="_blank"&gt;sample project&lt;/a&gt;&lt;span&gt;, open the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;FineGrainedDeltas&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;folder and navigate to&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;OrderTaxCalculator&lt;/span&gt;.cs&lt;/strong&gt;&lt;span&gt;. Notice t&lt;/span&gt;he &lt;code class="language-csharp"&gt;ComputeTaxes()&lt;/code&gt;&amp;nbsp;method is non-trivial and could&amp;nbsp;resemble real production code, with multiple early exits, counters, and guard clauses.&lt;/div&gt;&lt;div&gt;Inside the main loop, you’ll see a &lt;strong&gt;TODO &lt;/strong&gt;describing a business rule:&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;// TODO: Apply the customer&amp;#39;s discount tax policy when calculating taxableBase.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is a subtle rule change. We don’t want to rewrite the method -- we just want to adjust how the taxable base is calculated under specific conditions.&lt;/p&gt;&lt;div&gt;Let&amp;#39;s delete the TODO comment and invoke AiGen. You can &lt;strong&gt;double-tap&lt;/strong&gt; the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and keep it &lt;strong&gt;held down &lt;/strong&gt;while using a natural, descriptive prompt such as:&lt;/div&gt;&lt;p style="margin-left:40px;"&gt;&lt;em&gt;&lt;span&gt;“&lt;em style="color:#1f2328;"&gt;Let&amp;#39;s incorporate the customer discount policy.&lt;/em&gt;&lt;/span&gt;&lt;/em&gt;&lt;br&gt;&lt;/p&gt;&lt;p dir="auto" style="color:#1f2328;"&gt;AiGen should:&lt;/p&gt;&lt;ul style="color:#1f2328;"&gt;&lt;li&gt;Change only the minimal code region required&lt;/li&gt;&lt;li&gt;Leave the rest of the method untouched&lt;/li&gt;&lt;li&gt;Apply the update directly in the editor (no manual copy/paste)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Turning this:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;decimal taxableBase = order.Subtotal - order.DiscountAmount;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;into something like this:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;decimal taxableBase = customer.DiscountPolicy switch {
    Customer.Discounts.ReduceTaxableBase =&amp;gt; order.Subtotal - order.DiscountAmount,
    Customer.Discounts.FullyTaxable =&amp;gt; order.Subtotal,
    _ =&amp;gt; order.Subtotal - order.DiscountAmount
};&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;p dir="auto" style="color:#1f2328;"&gt;Note both the size of the method and how little code AiGen needs to generate to apply the change.&lt;/p&gt;&lt;p dir="auto" style="color:#1f2328;"&gt;The prompt doesn’t require exact symbol names or structured references — we describe intent, and AiGen resolves the implementation from surrounding context.&lt;/p&gt;&lt;p dir="auto" style="color:#1f2328;"&gt;This example demonstrates fine-grained deltas in practice: smaller outputs, lower token usage, reduced latency, and a more immediate turnaround — especially when working inside large methods.&lt;/p&gt;&lt;p dir="auto" style="color:#1f2328;"&gt;After AiGen applies the change, you can find evidence of the smaller delta in two places:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;AiGen Navigator status bar: Check the Reasoning out token count and the elapsed time (114 output tokens and 3.2 seconds, respectively, in the screenshot below). Fine-grained deltas yield small output token counts — typically far smaller than the count required to regenerate an entire method.image&lt;br&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/AiGen_SurgicalEdits1%20.png" alt="" style="width:713px;height:284px;"&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Editor selection: Selecting a change in the AiGen Navigator (e.g., &amp;quot;∆ selection&amp;quot;) highlights the inserted/modified region, making the delta boundary immediately visible. In the screenshot below, the selection represents the small portion of the method that was regenerated. The rest of the method was untouched by AI.&lt;br&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/AiGen_SurgicalEdits2%20.png" alt="" style="width:513px;height:797px;"&gt;&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This is why AiGen feels fast even when working inside large blocks of code: you’re not overpaying (in time or tokens) for code that isn’t changing.&lt;/div&gt;&lt;p&gt;What&amp;#39;s also exciting about these optimized deltas, you are free to &lt;strong&gt;edit &lt;/strong&gt;(or apply tooling to)  &lt;strong&gt;surrounding code &lt;/strong&gt;while waiting for AI to return.&lt;/p&gt;&lt;p&gt;Which brings us to our next topic....&lt;/p&gt;&lt;h2&gt;Working While AI Is Running: In-Flight Changes &amp;amp; Conflict Navigation&lt;/h2&gt;&lt;div&gt;One of the most frustrating aspects of modern AI-assisted coding tools is that they&amp;nbsp;repeatedly block&amp;nbsp;your flow. You ask for help, then you wait -- hands off the keyboard -- until the response finally returns.&lt;/div&gt;&lt;div&gt;AiGen removes that bottleneck.&lt;/div&gt;&lt;div&gt;When AiGen&amp;nbsp;requests are launched, you’re free to continue coding. You can edit the same file, move elsewhere in the solution, or even launch additional coding agents.&amp;nbsp; AiGen anchors each request&amp;nbsp;to the code state at launch and safely validates those changes on return.&lt;/div&gt;&lt;div&gt;When changes are non-overlapping -- as they can be in intentional multi-agent workflows -- AiGen applies the results cleanly and without interruption.&amp;nbsp;&lt;/div&gt;&lt;div&gt;For example, you can ask AiGen to modify one part of a C# method while you continue working in another part of the same method.&lt;/div&gt;&lt;div&gt;	If in-flight edits overlap with part&amp;nbsp;of a reasoning response&amp;#39;s intended changes, AiGen withholds&amp;nbsp;only the conflicting change and surfaces both the reason and the change it was prepared to apply. We&amp;#39;ll see an example of this in a moment.&lt;/div&gt;&lt;h3&gt;Scenario A: Non-Conflicting Changes -- AI + Human&lt;/h3&gt;&lt;div&gt;&lt;span&gt;Navigate to&amp;nbsp;&lt;/span&gt;the &lt;strong&gt;InFlightEdits &lt;/strong&gt;folder and open&amp;nbsp;&lt;strong&gt;&lt;span&gt;OrderSubmissionService.cs&lt;/span&gt;&lt;/strong&gt;. The &lt;code class="language-csharp"&gt;Submit()&lt;/code&gt;&amp;nbsp;method contains several failure points&lt;span&gt;&amp;nbsp;--&amp;nbsp;&lt;/span&gt;exactly the kind of code where you might want better diagnostics. To prepare for this simultaneous edit demo, first, copy the following text to the clipboard:&lt;/div&gt;&lt;p&gt;&amp;gt;&amp;nbsp;&lt;span&gt;Logs any failures.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;Next, place the caret anywhere inside the &lt;code&gt;Submit()&lt;/code&gt;&lt;span&gt;&amp;nbsp;method&amp;nbsp;&lt;/span&gt;and invoke AiGen with a request like:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;em&gt;“Add logging around failures in this method.”&lt;/em&gt;&lt;/div&gt;&lt;div&gt;While the AI request is running, move the caret to the XML documentation comment and paste the text from the clipboard to the end of the XML doc comment. The goal is to make this change before the AI response lands (if AI is faster, you can undo and try again -- you typically have 2-5&amp;nbsp;seconds to make the change while this logging request is in-flight).&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/LoggingAroundFailures.png" alt="" style="width:1013px;height:263px;"&gt;&lt;div&gt;When the AI response lands, you’ll see:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;The logging changes are applied correctly.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Your manual documentation edit is preserved.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;No manual merging is required.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/ManualEditsPlusAiChanges.png" alt="" style="width:912px;height:315px;"&gt;&lt;div&gt;AiGen doesn’t lock the editor or assume code is frozen while it works. It assumes you’re still working --&amp;nbsp;because you are.&lt;/div&gt;&lt;h3&gt;&lt;span&gt;Scenario B: Parallel,&amp;nbsp;Non-Conflicting Changes -- Multiple AI Agents&lt;/span&gt;&lt;br&gt;&lt;/h3&gt;&lt;div&gt;Let&amp;#39;s undo our recent changes and restore&amp;nbsp;&lt;strong&gt;OrderSubmissionService.cs&lt;/strong&gt; to its original cloned state.&lt;/div&gt;&lt;div&gt;For this next scenario, we&amp;#39;ll launch &lt;strong&gt;two AI agents&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;simultaneously &lt;/strong&gt;to work on the same method&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The first agent will add &lt;strong&gt;logging &lt;/strong&gt;(like we just did in the last scenario), and the second agent will add &lt;strong&gt;telemetry &lt;/strong&gt;so we can track orders (using the &lt;code class="language-csharp"&gt;TrackOperationAttribute&lt;/code&gt;&amp;nbsp;declared in the &lt;strong&gt;Shared &lt;/strong&gt;folder).&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;Start by opening&amp;nbsp;&lt;/span&gt;&lt;strong&gt;TrackOperationAttribute.cs&lt;/strong&gt;&amp;nbsp;from the &lt;strong&gt;Shared&amp;nbsp;&lt;/strong&gt;&lt;span&gt;folder&amp;nbsp;&lt;/span&gt;and examining&amp;nbsp;the class. This is the custom attribute we&amp;#39;ll use for telemetry. Note that it includes properties for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;&amp;nbsp;--&amp;nbsp;describes whatever we&amp;#39;re tracking &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Category&lt;/strong&gt; -- groups related telemetry events&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Next, switch back to &lt;strong&gt;OrderSubmissionService.cs&lt;/strong&gt;&amp;nbsp;and place the caret in the&amp;nbsp;&lt;code class="language-csharp"&gt;Submit()&lt;/code&gt; method. The next two steps should be performed&amp;nbsp;back to back.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Launch the first agent with:&amp;nbsp;&lt;em&gt;“Add logging around failures in this method.”&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Launch the second agent with: &lt;em&gt;&amp;quot;&lt;em style="color:#59636e;"&gt;Add the track operation attribute. Category is orders.&lt;/em&gt;&amp;quot;&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="color:#1f2328;"&gt;The goal here is to start up a second agent while the first is still inflight. If the first AI response lands before you can launch the second, perform an undo (close the AiGen Navigator) and then copy the second prompt to the clipboard. Then after launching the first agent by voice, invoke the second agent with&amp;nbsp;&lt;/span&gt;&lt;strong style="font-weight:600;color:#1f2328;"&gt;Caps&lt;/strong&gt;&lt;span style="color:#1f2328;"&gt;+&lt;/span&gt;&lt;strong style="font-weight:600;color:#1f2328;"&gt;G&lt;/strong&gt;&lt;span style="color:#1f2328;"&gt;&amp;nbsp;(plus a paste).&lt;/span&gt;&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/AddTelemetry.png" alt="" style="width:537px;height:217px;"&gt;&lt;p&gt;When multiple AI responses land, the AiGen Navigator shows multiple landings using &lt;strong&gt;tabs&lt;/strong&gt;. In the screenshot below, notice the agents landed in &lt;strong&gt;reverse order &lt;/strong&gt;from take-off, with the tracking attribute finishing first.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/FailureLoggingLandedLast.png" alt="" style="width:759px;height:505px;"&gt;&lt;/p&gt;&lt;p&gt;Notice AiGen correctly discovered the &lt;code class="language-csharp"&gt;TrackOperationAttribute&lt;/code&gt;&amp;nbsp;from the&amp;nbsp;&lt;strong&gt;Shared &lt;/strong&gt;folder and added it with appropriate values for both &lt;strong&gt;Name &lt;/strong&gt;and &lt;strong&gt;Category&lt;/strong&gt;. Also note the orange arrow in the screenshot above -- it points to the second AI landing (&amp;quot;Failure logging&amp;quot; in this example -- your tabs may have different tab titles and agents may complete in a different order than they were launched). &lt;/p&gt;&lt;p&gt;AiGen Navigator tabs may display one or more of the following icons:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;⭐&amp;nbsp;&lt;/span&gt;Star -- the landing has not yet been viewed (typically a recent result).&lt;/li&gt;&lt;li&gt;&lt;span&gt;✔️&amp;nbsp;&lt;/span&gt;Check -- all changes were successfully integrated (no conflicts)&lt;/li&gt;&lt;li&gt;&lt;span&gt;❗&amp;nbsp;&lt;/span&gt;Exclamation --&amp;nbsp;one or more conflicts occurred on landing &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Notice that:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;One agent modifies the **method body** (logging)&lt;/li&gt;&lt;li&gt;The other modifies the **method metadata** (the attribute)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Because these changes target **different structural regions**, both land successfully without conflict.&lt;/div&gt;&lt;div&gt;Skilled developers can safely run multiple AI agents in parallel when:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;The requested changes **do not overlap**, and&lt;/li&gt;&lt;li&gt;Each agent’s task can be completed **independently** of the others.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;strong&gt;Note&lt;/strong&gt;:&amp;nbsp;When multiple in-flight AI agents complete their changes, undo follows &lt;strong&gt;landing order&lt;/strong&gt;, not launch order — the most recently applied change is undone first. This mirrors standard Visual Studio editor behavior and keeps AI changes fully integrated into the undo stack.&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;h3&gt;Scenario C: Conflicting Changes&lt;/h3&gt;&lt;div&gt;Now let’s look at what happens &lt;strong&gt;when a conflict does occur&lt;/strong&gt;.&lt;/div&gt;&lt;div&gt;Start by undoing the previous edits to restore &lt;code class="language-csharp"&gt;OrderSubmissionService.Submit()&lt;/code&gt;to its original state.&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Note:&lt;/strong&gt; When multiple in-flight AI agents complete&amp;nbsp;their changes, undo follows &lt;strong&gt;landing order&lt;/strong&gt;, not launch order -- the &lt;strong&gt;most recently &lt;/strong&gt;&lt;strong&gt;applied change &lt;/strong&gt;is undone first. This mirrors normal Visual Studio editor behavior and keeps AI changes fully integrated into the standard undo stack.&lt;br&gt;&lt;/div&gt;&lt;div&gt;Next, we&amp;#39;ll launch the same AI request as before:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;em&gt;“Add logging around failures in this method.”&lt;/em&gt;&lt;/div&gt;&lt;div&gt;While the request is in flight, make a &lt;strong&gt;meaningful overlapping change&lt;/strong&gt; to one of the failure points.&amp;nbsp;For example, replace a &lt;code class="language-csharp"&gt;throw&lt;/code&gt;&amp;nbsp;with an early &lt;code class="language-csharp"&gt;return null;&lt;/code&gt;.&lt;/div&gt;&lt;div&gt;When the reasoning response lands, AiGen detects that &lt;strong&gt;one of the targeted code blocks has changed &lt;/strong&gt;since the request was launched. Rather than guessing or overwriting your work, AiGen&lt;strong&gt;&amp;nbsp;blocks &lt;/strong&gt;&lt;strong&gt;only &lt;/strong&gt;&lt;strong&gt;the conflicting integration&lt;/strong&gt;&amp;nbsp;while allowing all non-conflicting changes to apply normally.&lt;/div&gt;&lt;div&gt;In the screenshot below, notice that logging was successfully added around every remaining throw statement (the five &amp;quot;selection&amp;quot; entries marked with only the delta symbol). Only the single failure point we modified in our example was held back.&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/CombinedCode.png" alt="" style="width:1182px;height:651px;"&gt;&lt;div&gt;For the blocked change, AiGen shows:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;The original code as it existed when the request was launched&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The current code at apply time&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The reasoning model&amp;#39;s attempted replacement&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This makes the conflict &lt;span&gt;&lt;strong&gt;isolated,&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;explicit, and safe to reason about&lt;/strong&gt;. You can clearly see:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;which change was blocked,&lt;/li&gt;&lt;li&gt;why it was blocked, and&lt;/li&gt;&lt;li&gt;exactly what AiGen was prepared to do.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Because AiGen typically produces **fine-grained deltas**, conflicts are isolated to the smallest possible change. A single overlapping edit does not invalidate the rest of the AI response — only the affected update is held back, while all other safe modifications are integrated.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The conflict report for the blocked delta shows the original code at request time and the current code at apply time, as well as the attempted replacement. You might see something like this:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin-left:40px;"&gt;&lt;strong&gt;The change for this member was skipped because the target code changed inflight.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;strong&gt;Original code at request time:&lt;/strong&gt;&lt;/div&gt;&lt;pre style="margin-left:40px;"&gt;&lt;code class="language-csharp"&gt;if (order.Customer is null)
  throw new InvalidOperationException(&amp;quot;Customer is required.&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;div style="margin-left:40px;"&gt;&lt;strong&gt;Current code at apply time:&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;if (order.Customer is null)
  return null;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;strong&gt;Attempted replacement:&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;if (order.Customer is null) {
  Console.Error.WriteLine($&amp;quot;[{nameof(OrderSubmissionService)}] Order submission failed: {nameof(order.Customer)} is required. OrderId=&amp;#39;{order.OrderId ?? &amp;quot;&amp;lt;null&amp;gt;&amp;quot;}&amp;#39;.&amp;quot;);
  throw new InvalidOperationException(&amp;quot;Customer is required.&amp;quot;);«Caret»
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;strong&gt;Original and current code blocks must match on landing.&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This section demonstrates how AiGen behaves when the code changes while AI requests are in flight — including parallel agents and isolated conflicts.&lt;/div&gt;&lt;p&gt;Everything else proceeds as expected -- no rollback, no guesswork, and no silent overwrites.&lt;/p&gt;&lt;h2&gt;Runtime State to Tests: Debug-Time Object Reconstruction&lt;/h2&gt;&lt;div&gt;So far, all of the examples have focused on static code&lt;span&gt;&amp;nbsp;--&amp;nbsp;&lt;/span&gt;types, methods, and edits driven by what’s visible in the editor. The next capability goes a step further by incorporating runtime state.&lt;/div&gt;&lt;div&gt;When you invoke AiGen while stopped at a breakpoint, it can now inspect the &lt;strong&gt;live debug-time values &lt;/strong&gt;in scope and include them (if appropriate) as part of the request. That allows the reasoning model to also work from actual execution data, not just source code.&lt;/div&gt;&lt;div&gt;This is especially powerful when the issue you’re investigating only becomes obvious at runtime.&lt;/div&gt;&lt;h3&gt;Example: Turning a Debug-Time Bug into a Targeted Test&lt;/h3&gt;&lt;div&gt;From the &lt;span&gt;&lt;strong&gt;DebugRuntimeState&lt;/strong&gt; folder o&lt;/span&gt;pen &lt;strong&gt;OrderAddressFormatter.cs&lt;/strong&gt;. The &lt;code class="language-csharp"&gt;BuildShippingLabel()&lt;/code&gt;&amp;nbsp;method formats a shipping label from customer and address data.&lt;/div&gt;&lt;div&gt;Place a &lt;strong&gt;breakpoint &lt;/strong&gt;on the &lt;strong&gt;final line&lt;/strong&gt; of this method and run the program. When execution stops, inspect the values inside&amp;nbsp;the Visual Studio debugging environment. In this scenario, you’ll notice that:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;code class="language-csharp"&gt;Region&lt;/code&gt;&amp;nbsp;is empty or whitespace&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The computed label (which includes &lt;code class="language-csharp"&gt;cityRegionPostal&lt;/code&gt;) contains a dangling comma and extra spaces&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/ExtraSpacesDanglingComma.png" alt="" style="width:314px;height:91px;"&gt;&lt;div&gt;The bug is subtle and data-dependent. You could fix it immediately&lt;span&gt;&amp;nbsp;--&amp;nbsp;&lt;/span&gt;but it’s a good idea to capture the behavior in a test first, so it doesn’t regress.&lt;/div&gt;&lt;div&gt;While &lt;span&gt;still&amp;nbsp;&lt;/span&gt;stopped at the breakpoint (with the caret inside the &lt;code&gt;BuildShippingLabel()&lt;/code&gt;&lt;span&gt;&amp;nbsp;method)&lt;/span&gt;, invoke AiGen and say:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;em&gt;“Create a test case for this method based on these debug-time parameter values.&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&lt;em&gt;Add asserts to make sure the label has no double spaces and no dangling comma when the region is blank.”&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#1f2328;"&gt;While waiting for the response, you might want to drill into the&amp;nbsp;&lt;/span&gt;&lt;code style="color:#1f2328;"&gt;order&lt;/code&gt;&lt;span style="color:#1f2328;"&gt;&amp;nbsp;parameter. It has a&amp;nbsp;&lt;/span&gt;&lt;code style="color:#1f2328;"&gt;Customer&lt;/code&gt;&lt;span style="color:#1f2328;"&gt;&amp;nbsp;property that in turn holds the&amp;nbsp;&lt;/span&gt;&lt;code style="color:#1f2328;"&gt;BillingAddress&lt;/code&gt;&lt;span style="color:#1f2328;"&gt;&amp;nbsp;with the empty region that led to this bug.&lt;/span&gt;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/ExploreOrder.png" alt="" style="width:618px;height:183px;"&gt;&lt;div&gt;AiGen will:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Reconstruct the runtime object graph for the&amp;nbsp;&lt;code class="language-csharp"&gt;order&lt;/code&gt; parameter using live debug-time values&lt;/li&gt;&lt;li&gt;Locate the appropriate&amp;nbsp;&lt;code&gt;OrderAddressFormatterTests&lt;/code&gt;&amp;nbsp;fixture&lt;/li&gt;&lt;li&gt;Generate a new xUnit test that reproduces the observed state and behavior&lt;/li&gt;&lt;li&gt;Add targeted assertions that detect the formatting defectUnderstand the object graph in scope (including nested properties/objects)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="color:#1f2328;"&gt;You should get a test case like this (note the object graph reconstruction at the top, which recreates the somewhat sophisticated debug-time state that exposed the bug):&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;    [Fact]
    public void BuildShippingLabel_RegionBlank_NoDoubleSpaces_AndNoDanglingComma() {
        // Arrange (debug-time values)
        var address = new Address {
            City = &amp;quot;Seattle&amp;quot;,
            Region = &amp;quot; &amp;quot;, // blank/whitespace
            PostalCode = &amp;quot;98101&amp;quot;,
            CountryCode = &amp;quot;US&amp;quot;,
            Line1 = &amp;quot;123 Example St&amp;quot;
        };
        var customer = new Customer { DisplayName = &amp;quot;Ada Lovelace&amp;quot;, BillingAddress = address, Id = &amp;quot;C-42&amp;quot; };
        var order = new Order {
            Customer = customer,
            DiscountAmount = 10m,
            Subtotal = 120m,
            OrderId = &amp;quot;DBG-1001&amp;quot;,
            TaxAmount = 0m
        };

        var formatter = new OrderAddressFormatter();

        // Act
        string label = formatter.BuildShippingLabel(order);

        // Assert
        Assert.DoesNotContain(&amp;quot;  &amp;quot;, label);       // no double spaces anywhere
        Assert.DoesNotContain(&amp;quot;, &amp;quot;, label);       // no dangling comma + space
        Assert.DoesNotMatch(@&amp;quot;,\s*(—|$)&amp;quot;, label); // no comma before em-dash or end
        Assert.DoesNotMatch(@&amp;quot;,\s+\d&amp;quot;, label);    // no comma followed by spaces then digits (e.g., &amp;quot;,  98101&amp;quot;)
        Assert.Contains(&amp;quot;Seattle&amp;quot;, label);
        Assert.Contains(&amp;quot;98101&amp;quot;, label);
    }&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;p dir="auto" style="color:#1f2328;"&gt;This workflow makes it practical to capture real-world edge cases in the moment they are discovered. Instead of manually attempting to duplicate observed state, you can promote live runtime data directly into a durable, repeatable test.&lt;/p&gt;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/AddRegressionTest.png" alt="" style="width:639px;height:200px;"&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#1f2328;"&gt;After creating the new test case, you can stop debugging and run the test case&amp;nbsp;if you like (it should fail since the issue we discovered in the sample code hasn&amp;#39;t been fixed yet).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#656565;font-family:&amp;#39;Open Sans Condensed&amp;#39;, HelveticaNeue-CondensedBold, Helvetica, &amp;#39;Arial Narrow&amp;#39;, Calibri, Arial, &amp;#39;Lucida Grande&amp;#39;, sans-serif;font-size:24px;"&gt;Why This Matter&lt;/span&gt;&lt;span style="color:#656565;font-family:&amp;#39;Open Sans Condensed&amp;#39;, HelveticaNeue-CondensedBold, Helvetica, &amp;#39;Arial Narrow&amp;#39;, Calibri, Arial, &amp;#39;Lucida Grande&amp;#39;, sans-serif;font-size:24px;"&gt;s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;This capability closes a familiar gap in debugging workflows. Developers often discover bugs while stepping through code, but translating those live-data observations into tests is tedious and error-prone.&lt;/div&gt;&lt;div&gt;By grounding test generation in captured debug-time values, AiGen makes it practical to:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Easily capture real-world edge cases&lt;/li&gt;&lt;li&gt;Generate focused, high-signal tests&lt;/li&gt;&lt;li&gt;Preserve the conditions that exposed the issue&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;It’s a natural extension of pair programming: you identify the problem while debugging, and AiGen helps you lock it down with a test before you move on.&lt;/div&gt;&lt;h2&gt;Large-Scale Architectural Changes: Evolving Interfaces Across Many Implementations&lt;/h2&gt;&lt;div&gt;So far, we’ve focused on fast, fine-grained edits — the kind that make AI practical for everyday work. But AiGen is not limited to small changes. It can also perform broad, cross-cutting architectural updates that span multiple files, types, and layers of a solution.&lt;/div&gt;&lt;div&gt;This next example demonstrates AiGen’s ability to generate &lt;strong&gt;new types &lt;/strong&gt;in &lt;strong&gt;bulk &lt;/strong&gt;and then &lt;strong&gt;evolve &lt;/strong&gt;an &lt;strong&gt;interface contract &lt;/strong&gt;across all of its implementers.&lt;/div&gt;&lt;h3&gt;Example: Generating and Evolving Order Rules&lt;/h3&gt;&lt;div&gt;In the &lt;a href="https://github.com/MillerMark/CodeRush.AiGen.Samples" target="_blank"&gt;sample project&lt;/a&gt;, open the &lt;strong&gt;ArchitecturalEdits&lt;/strong&gt; folder and navigate to &lt;strong&gt;IOrderRule.cs&lt;/strong&gt;. You’ll see a minimal interface:&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;namespace CodeRush.AiGen.Main.ArchitecturalEdits;

public interface IOrderRule {
    RuleResult Apply(Order order);
}&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;Place your caret inside the interface and invoke AiGen with the following prompt:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;em&gt;“I need ten non-trivial implementers of this interface. Put them in the rules namespace.”&lt;/em&gt;&lt;/div&gt;&lt;div&gt;Unlike previous demos, this request generates multiple new classes, each implementing distinct business logic. Because the reasoning model is synthesizing several non-trivial implementations, this step may take longer than the earlier examples.&lt;/div&gt;&lt;div&gt;When the request completes, AiGen creates a new &lt;strong&gt;Rules&lt;/strong&gt; namespace containing ten concrete implementations of &lt;code class="language-csharp"&gt;IOrderRule&lt;/code&gt; — each reflecting realistic order-processing concerns such as fraud detection, pricing validation, eligibility checks, and fulfillment constraints.&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/RulesFolder_1.png" alt="" style="width:453px;height:383px;"&gt;&lt;div&gt;This demonstrates AiGen’s ability to:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Generate multiple production-quality types in a single request&lt;/li&gt;&lt;li&gt;Maintain a shared contract across many implementations&lt;/li&gt;&lt;li&gt;Respect namespace organization and solution structure&lt;/li&gt;&lt;li&gt;Coordinate multi-file changes across a codebase&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Evolving the Contract Across the Hierarchy&lt;/h3&gt;&lt;div&gt;Now return to &lt;strong&gt;IOrderRule.cs&lt;/strong&gt; and invoke AiGen again with:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;em&gt;“Add two properties — name and description — and update all implementers.”&lt;/em&gt;&lt;/div&gt;&lt;div&gt;AiGen updates the interface to include the new properties, then propagates those changes across all existing rule implementations — ensuring each class remains compliant with the updated contract.&lt;/div&gt;&lt;div&gt;Because this step modifies existing code rather than generating new types, it typically completes much faster than the bulk-creation step.&lt;/div&gt;&lt;div&gt;Together, these prompts demonstrate AiGen’s ability to perform:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Large-scale architectural refactorings&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Contract evolution across many implementers&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Coordinated multi-file updates&lt;/strong&gt; without manual intervention&lt;/li&gt;&lt;li&gt;&lt;strong&gt;High-level structural changes&lt;/strong&gt;&amp;nbsp;(in addition to surgical edits)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Earlier examples highlighted AiGen’s speed and precision for small changes. This scenario shows the other side of the system — the ability to reshape architecture across an entire subsystem when needed.&lt;/div&gt;&lt;h2&gt;Fixing Code Using Active Compiler Errors&lt;/h2&gt;&lt;p&gt;Until now, we’ve focused on how AiGen understands source code, hierarchy, and runtime state. But AiGen can also reason over&amp;nbsp;&lt;strong&gt;active compiler errors&lt;/strong&gt;&amp;nbsp;— both at the caret and across the Visual Studio Errors list.&lt;/p&gt;&lt;p&gt;This allows you to resolve broken code using short, natural prompts, without needing to restate what the error is or why it occurred.&lt;/p&gt;&lt;h3&gt;Example: Fixing a Real Compiler Error with “Fix this”&lt;/h3&gt;&lt;div&gt;In the sample project, open the&amp;nbsp;&lt;strong&gt;ActiveErrorAnalysis&amp;nbsp;&lt;/strong&gt;folder and navigate to&amp;nbsp;&lt;strong&gt;OrderQueryService.cs&lt;/strong&gt;.&lt;/div&gt;&lt;div&gt;At the top of the file, you’ll see a demo toggle:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;// Demo toggle:
// TODO: Uncomment the line below to intentionally introduce a compiler error on the `where` clause, below.
//#define DEMO_ACTIVE_ERRORS&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Now place your caret on the&amp;nbsp;&lt;code&gt;Where()&lt;/code&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;call in the broken LINQ query and invoke AiGen. Simply say:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;em&gt;“Fix this.”&lt;/em&gt;&lt;/div&gt;&lt;div&gt;There’s no need to explain the problem. AiGen inspects the active compiler diagnostics, analyzes the surrounding code, and determines the appropriate fix.&lt;/div&gt;&lt;div&gt;Here is a typical AiGen response to this error and surrounding code:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;public async Task&amp;lt;int&amp;gt; GetHighValueOrderCountAsync(decimal minSubtotal) {
  var orders = await GetOrdersAsync().ConfigureAwait(false);
  return orders.Count(o =&amp;gt; o.Subtotal &amp;gt;= minSubtotal);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;The fix is driven by real compiler feedback, not by a manually described problem.&lt;/div&gt;&lt;div&gt;This demonstrates AiGen’s ability to:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Read live compiler diagnostics from the editor&lt;/li&gt;&lt;li&gt;Infer intent from the actual error, not just the source text&lt;/li&gt;&lt;li&gt;Generate a non-trivial corrective refactor with a minimal prompt&lt;/li&gt;&lt;li&gt;Resolve failures without requiring developers to restate what the compiler already knows&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In practice, this makes AI useful not just for writing new code — but for repairing broken code quickly and contextually.&lt;/div&gt;&lt;h2&gt;What This Update Unlocks&lt;/h2&gt;&lt;div&gt;Taken together, these examples illustrate a shift in how AI assistance fits into everyday development.&lt;/div&gt;&lt;div&gt;AI Assistance is no longer something you reach for only when you’re willing to pause, wait, and review a large block of regenerated code. With faster/smarter context acquisition, fine-grained deltas, conservative integration, and awareness of both code &lt;em&gt;and &lt;/em&gt;runtime state, it also becomes practical to use AI for small, precise tasks -- the kind that make up most real work.&lt;/div&gt;&lt;div&gt;In practice, this means:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;You can ask for &lt;strong&gt;surgically precise changes&lt;/strong&gt; inside large methods without paying or waiting for redundant regeneration.&lt;/li&gt;&lt;li&gt;You can continue working while AI requests are in-flight, or even launch &lt;strong&gt;multiple agents in parallel &lt;/strong&gt;when tasks impact&amp;nbsp;&lt;span&gt;non-overlapping areas of code&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Individual conflicts &lt;/strong&gt;-- caused by overlapping edits while AI requests are in-flight --&amp;nbsp;are &lt;strong&gt;isolated and surfaced&lt;/strong&gt; in the UI, rather than forcing all-or-nothing outcomes.&lt;/li&gt;&lt;li&gt;Debug-time state observations can be turned into &lt;strong&gt;targeted tests&lt;/strong&gt;, grounded in real execution data.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;None of this requires verbose prompts, detailed instructions, or explicitly naming symbols or files. AiGen is designed to infer intent from context&lt;span&gt;&amp;nbsp;--&amp;nbsp;&lt;/span&gt;types, hierarchy, editor state, and runtime values -- so you can speak naturally and stay in flow.&lt;/div&gt;&lt;div&gt;If you’re an existing &lt;a href="https://www.devexpress.com/products/coderush/" target="_blank"&gt;CodeRush&lt;/a&gt; user, these capabilities are available now in the latest release. If you’re new to CodeRush (it&amp;#39;s free on the &lt;a href="https://marketplace.visualstudio.com/items?itemName=DevExpress.CodeRushforVS2022" target="_blank"&gt;Visual Studio Marketplace&lt;/a&gt;), the &lt;a href="https://github.com/MillerMark/CodeRush.AiGen.Samples" target="_blank"&gt;sample project&lt;/a&gt; referenced in this post is a good place to start exploring how AiGen behaves in real scenarios.&lt;/div&gt;&lt;div&gt;AI tooling works best when it’s fast, precise, and respectful of the code you already have. This release is about moving closer to that ideal&lt;span&gt;&amp;nbsp;--&amp;nbsp;&lt;/span&gt;so AI becomes something you use routinely, not something you have to plan around.&lt;/div&gt;&lt;h3&gt;Limitations&lt;/h3&gt;&lt;p&gt;AiGen is optimized to work fast in&amp;nbsp;C# files and XAML.&amp;nbsp;However,&amp;nbsp;as&amp;nbsp;with any tooling involving AI models,&amp;nbsp;AiGen has some limitations:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;AiGen can generate&amp;nbsp;&lt;strong&gt;&lt;em&gt;new files&amp;nbsp;&lt;/em&gt;in any programming language&amp;nbsp;&lt;/strong&gt;and add them to the active project, but it&amp;nbsp;&lt;strong&gt;can only&amp;nbsp;&lt;em&gt;modify&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;C# and XAML&lt;/strong&gt;&amp;nbsp;files.&lt;/li&gt;&lt;li&gt;&lt;span&gt;​&lt;/span&gt;Multi-agent support and editing while AI is in-flight is currently available in C# only,&amp;nbsp;For&amp;nbsp;XAML,&amp;nbsp;wait for the&amp;nbsp;AI response&amp;nbsp;to land before making changes&amp;nbsp;to the same XAML file.&lt;/li&gt;&lt;li&gt;Blazor support is pending&lt;/li&gt;&lt;li&gt;There are some reasonable depth limitations on reconstructing debug-time object graphs and on traversing class hierarchies for the context window.&lt;/li&gt;&lt;li&gt;AiGen cannot delete files or remove files from the project.&lt;/li&gt;&lt;li&gt;Aside from adding new files and installing NuGet packages, AiGen cannot modify the project file or the solution file (so there&amp;#39;s currently no way to create or add new projects or add/modify project properties).&lt;/li&gt;&lt;li&gt;AiGen is not a chat window based tool, and there is no history/memory of previous actions. Context is derived entirely from your prompt, the editor view, surrounding code, the solution source, debug values, etc..&lt;/li&gt;&lt;li&gt;There are the usual limitations and disclaimers on the power of AI itself. Sometimes AI &amp;quot;hallucinates&amp;quot; (this is especially true when generating code based on frameworks that have changed or&amp;nbsp;where API evolution has introduced breaking changes over time). Also, it is possible to have a request so complex AI has difficulty implementing it correctly.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 26 Feb 2026 08:00:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388265</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2025/09/09/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/Accessibility">Accessibility</category>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/AI+Agents">AI Agents</category>
      <category domain="https://community.devexpress.com/Tags/AiFind">AiFind</category>
      <category domain="https://community.devexpress.com/Tags/AiGen">AiGen</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/GitHub+Copilot+Chat">GitHub Copilot Chat</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Coding">Voice Coding</category>
      <title>Advanced AI Setup for AiGen and AiFind in CodeRush for Visual Studio</title>
      <description>&lt;p&gt;This post explores advanced setup options for CodeRush&amp;#39;s AI-powered features. CodeRush currently supports two AI providers — OpenAI’s direct API and Microsoft’s Azure OpenAI Service. An API key is needed for either service.&lt;/p&gt;&lt;p&gt;Let&amp;#39;s first enable AI features and select a service, then dive into the appropriate section&amp;nbsp;for individual options on the service you select.&lt;/p&gt;&lt;h2&gt;Quick Jump:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#general-setup"&gt;General Setup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#open-ai-direct-api-setup"&gt;OpenAI direct API setup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#deploying-new-azure-resource"&gt;Deploying a new Azure Resource&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#azure-open-ai-setup"&gt;Azure Open AI setup&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="general-setup"&gt;About AiGen &amp;amp; AiFind&lt;/h2&gt;&lt;p&gt;CodeRush AI features are a powerful alternative to chat-based AI coding assistance. CodeRush AI assistance is generally:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Faster&amp;nbsp;&lt;/strong&gt;(smaller context window - one question + one answer).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cheaper&amp;nbsp;&lt;/strong&gt;(fewer tokens, lower&amp;nbsp;environmental&amp;nbsp;impact).&lt;/li&gt;&lt;li&gt;More&amp;nbsp;&lt;strong&gt;integrated&lt;/strong&gt;&amp;nbsp;(multiple AI-driven&amp;nbsp;responses are immediately&amp;nbsp;integrated directly into the source).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Safer&amp;nbsp;&lt;/strong&gt;(single undo/redo, language-specific agents check/condition&amp;nbsp;response before insertion, AI usage is logged and auditable, supports Azure enterprise tenant so your source code is secure).&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="general-setup"&gt;General Setup&lt;/h2&gt;&lt;p&gt;To enable CodeRush AI features, follow these steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Bring up the &lt;strong&gt;CodeRush &lt;/strong&gt;&lt;strong&gt;Options &lt;/strong&gt;dialog.&lt;/li&gt;&lt;li&gt;Navigate to the&amp;nbsp;&amp;quot;&lt;strong&gt;IDE&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Cognitive&lt;/strong&gt;-&amp;gt;&lt;strong&gt;General&lt;/strong&gt;&amp;quot; options page.&lt;/li&gt;&lt;li&gt;Check the &amp;quot;&lt;strong&gt;Enable Cognitive Features&lt;/strong&gt;&amp;quot; checkbox. You can also optionally enable voice features. For more about &lt;span&gt;voice&amp;nbsp;&lt;/span&gt;setup and troubleshooting, &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/05/voice-setup-in-coderush-for-visual-studio.aspx"&gt;click here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Navigate to the &amp;quot;IDE-&amp;gt;Cognitive-&amp;gt;&lt;strong&gt;API Keys&lt;/strong&gt;&amp;quot; options page.&lt;/li&gt;&lt;li&gt;If you have an OpenAI direct API key, click &amp;quot;&lt;strong&gt;OpenAI (official API)&lt;/strong&gt;&amp;quot;. If you prefer to use Azure OpenAI, click &amp;quot;&lt;strong&gt;Azure Open AI (Microsoft-hosted)&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;Fill out the service-specific options. I&amp;#39;ll dive into each of these options in the separate sections below. Jump to &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#open-ai-direct-api-setup"&gt;OpenAI direct API setup&lt;/a&gt; or &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#azure-open-ai-setup"&gt;Azure Open AI setup&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Enter your chosen service&amp;nbsp;&lt;strong&gt;API key &lt;/strong&gt;in the corresponding field below. API keys are stored on the local machine in the specified&amp;nbsp;environment variables.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;OpenAI direct API setup is next. Or jump ahead to &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#azure-open-ai-setup"&gt;Azure Open AI setup&lt;/a&gt;.&lt;/p&gt;&lt;h2 id="open-ai-direct-api-setup"&gt;OpenAI direct API setup&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;Bring up the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;CodeRush&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Options&amp;nbsp;&lt;/strong&gt;&lt;span&gt;dialog.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Navigate to the &amp;quot;&lt;strong&gt;IDE&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Cognitive&lt;/strong&gt;-&amp;gt;&lt;strong&gt;API Keys&lt;/strong&gt;&amp;quot; options page.&lt;/li&gt;&lt;li&gt;Select the &amp;quot;&lt;strong&gt;OpenAI (official API)&lt;/strong&gt;&amp;quot; service. You will need an&amp;nbsp;&lt;span&gt;API key from &lt;span&gt;OpenAI&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Select the desired model and fill out the service-specific options. The user interface will adapt to allow you to configure settings for the model you select.&lt;/li&gt;&lt;/ol&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/OpenAiirect.png" alt=""&gt;&lt;p&gt;Individual options are covered next.&lt;/p&gt;&lt;h3 id="max-response-tokens"&gt;Max Response Tokens&lt;/h3&gt;&lt;p&gt;This is the maximum length of the&amp;nbsp;reply. This tells the model how many tokens it’s allowed to generate at most. Larger values give longer answers (but likely cost more), while smaller values produce shorter, faster replies. Since the response is often generated code, it&amp;#39;s generally a good idea to use the maximum response token limit supported by the model. I recommend 16k-32k for a solid experience, or an even higher limit if the model and your budget can support it. This field accepts whole numbers (e.g., &amp;quot;4096&amp;quot;) as well as multiplier abbreviations (e.g., using &amp;quot;k&amp;quot; for x1000 and &amp;quot;M&amp;quot; for x1000000 as in 128k or 1M). Setting this field &lt;span&gt;to a&amp;nbsp;&lt;/span&gt;value higher than your model can support may result in an error response returned from OpenAI, so if you see that simply dial back the number in this field until it is in range.&lt;/p&gt;&lt;h3 id="pricing"&gt;Token Pricing&lt;/h3&gt;&lt;p&gt;&lt;span&gt;This is the&amp;nbsp;&lt;/span&gt;cost per 1M tokens (input &amp;amp; output). CodeRush uses these values to estimate the cost of each interaction, showing it in the AiGen Navigator&amp;#39;s status bar&amp;nbsp;and recording it&amp;nbsp;in the logs. Input tokens (prompts + context sent to AI) and output tokens (the AI’s response) typically have different prices, so you’ll see two fields here. The values specified here&amp;nbsp;don’t change how the API calls&amp;nbsp;are made — it’s just for cost tracking and visibility. &lt;/p&gt;&lt;p&gt;Note that values entered here can be in any currency. Whatever currency you use, CodeRush will use in the logs and in the display text on the &lt;span&gt;status bar&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Note also that when you switch models, CodeRush will auto-fill these fields with the latest pricing at the time of our last build. You can check these prices for accuracy by clicking the link below the Token Pricing fields. You can also use this to compare the relative pricing of the different models (&lt;strong&gt;careful &lt;/strong&gt;-- some models can be significantly more expensive than others). You can find OpenAI&amp;#39;s latest pricing &lt;a href="https://platform.openai.com/docs/pricing"&gt;here&lt;/a&gt;&amp;nbsp;(the same link also exists in the API keys Options page).&lt;/p&gt;&lt;h3 id="temperature"&gt;Temperature&lt;/h3&gt;&lt;p&gt;&lt;span&gt;This setting a&lt;/span&gt;djusts how predictable or creative the AI’s replies are. Lower values (near 0) produce more consistent, reliable results, while higher values (near 1) encourage more variation and creativity. This option is supported and visible when &lt;strong&gt;gpt-4.1 and earlier models &lt;/strong&gt;are selected, and does not appear for gpt-5 models and up.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Temperature.png" alt=""&gt;&lt;/p&gt;&lt;h3 id="verbosity"&gt;Verbosity &amp;amp; Reasoning Effort&lt;/h3&gt;&lt;p&gt;These controls let you tune how much detail the model includes in its answers (Verbosity) and how much internal effort it invests in solving the problem (Reasoning Effort). Lower settings are generally faster and cheaper, while higher settings provide more thorough, detailed, and accurate responses at the cost of speed and token usage. These options appear only when you select &lt;strong&gt;gpt-5 &lt;/strong&gt;and later models in the options dialog. They are hidden for &lt;strong&gt;gpt-4.1 &lt;/strong&gt;and earlier models.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/VerbosityResoningEffort.png" alt=""&gt;&lt;/p&gt;&lt;h4&gt;Performance Note&lt;/h4&gt;&lt;p&gt;Both &lt;strong&gt;Verbosity&lt;/strong&gt; and &lt;strong&gt;Reasoning Effort&lt;/strong&gt; affect &lt;strong&gt;performance and token cost&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Higher verbosity means more tokens returned (increasing&amp;nbsp;costs).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Higher reasoning effort &lt;span&gt;means&amp;nbsp;&lt;/span&gt;more compute cycles occur inside the model, so responses may take noticeably longer.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Once you have the options set as desired, jump down to the &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#quick-test"&gt;Quick Test&lt;/a&gt; section below for instructions on how you can try this out.&lt;/p&gt;&lt;h2 id="deploying-new-azure-resource"&gt;Deploying a new Azure Resource&lt;/h2&gt;&lt;p&gt;Before you can use Azure OpenAI with CodeRush AiGen, you’ll need to create a new Azure resource (full, official Microsoft guide is &lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/create-resource" target="_blank"&gt;here&lt;/a&gt;). This resource hosts your deployments (specific models such as gpt-4 or gpt-5) and provides the &lt;strong&gt;endpoint&lt;/strong&gt; and &lt;strong&gt;API keys&lt;/strong&gt; that CodeRush uses to connect.&lt;/p&gt;&lt;p&gt;If you already have an&amp;nbsp;&lt;span&gt;Azure OpenAI resource created, you can jump ahead &lt;span&gt;to&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#azure-open-ai-setup"&gt;Azure Open AI setup&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1.&amp;nbsp;&lt;strong&gt;Sign in to the Azure Portal&lt;/strong&gt; at &lt;a rel="noopener" target="_new"&gt;portal.azure.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;2. Click&amp;nbsp;&lt;strong&gt;Create&amp;nbsp;a resource&lt;/strong&gt;, search for &lt;strong&gt;OpenAI&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;3. Find the Azure OpenAI service, click &lt;strong&gt;Create&lt;/strong&gt;, and select &amp;quot;&lt;strong&gt;Azure OpenAI&lt;/strong&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AdvancedAiSetup/CreateAzureOpenAi.png" alt=""&gt;&lt;/p&gt;&lt;p&gt;4. On the &lt;strong&gt;Basics&lt;/strong&gt; page:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Select your &lt;strong&gt;Subscription&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Choose or create a &lt;strong&gt;Resource group&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Pick a &lt;strong&gt;Region&lt;/strong&gt; that supports Azure OpenAI.&lt;/li&gt;&lt;li&gt;Under the &lt;strong&gt;Instance Details&lt;/strong&gt; section, enter a unique resource &lt;strong&gt;Name&lt;/strong&gt;.&amp;nbsp;&lt;span&gt;This&amp;nbsp;&lt;/span&gt;&lt;strong&gt;resource name&amp;nbsp;&lt;/strong&gt;&lt;span&gt;will be used in the CodeRush options dialog.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Leave the pricing tier at&amp;nbsp;&lt;strong&gt;Standard S0&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AdvancedAiSetup/BasicsPage.png" alt=""&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;5. Click &lt;strong&gt;Next &lt;/strong&gt;until you land on the&amp;nbsp;&lt;strong&gt;Review + submit&lt;/strong&gt;&amp;nbsp;page, then click&amp;nbsp;&lt;strong&gt;Create&lt;/strong&gt;&amp;nbsp;at the bottom of the page. Deployment usually takes less than a minute.&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/DeploymentComplete.png" alt=""&gt;&lt;p&gt;6. Once deployment finishes, click &lt;strong&gt;Go to resource&lt;/strong&gt;.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AdvancedAiSetup/ExploreAiFoundryPortal.png" alt=""&gt;&lt;p&gt;7. Select &lt;strong&gt;Explore Azure AI Foundry portal&lt;/strong&gt;. This should open the AI Foundry in a new browser tab.&lt;br&gt;&lt;/p&gt;&lt;p&gt;8. Inside AI Foundry, open the &lt;strong&gt;Chat Playground&lt;/strong&gt;, click &lt;strong&gt;Create a deployment&lt;/strong&gt;, and choose a model (e.g. gpt-4.1,&amp;nbsp;gpt-5, etc.) and click &lt;strong&gt;Confirm&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;9. Enter a &lt;strong&gt;Deployment name &lt;/strong&gt;(or accept the default). This &lt;strong&gt;deployment name &lt;/strong&gt;will be used in the CodeRush options dialog.&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/DeployGpt.png" alt=""&gt;&lt;p&gt;10. Click &lt;strong&gt;Deploy&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;11, Back on the &lt;strong&gt;previous browser tab&lt;/strong&gt; for your &lt;strong&gt;Azure OpenAI &lt;/strong&gt;service, click the &amp;quot;&lt;strong&gt;Click here to manage keys&lt;/strong&gt;&amp;quot; link. This will bring up the Keys and Endpoint page. You can copy your API keys from this page (also needed for setup, below).&lt;/p&gt;&lt;p&gt;If you encountered any challenges on setting up a new Azure OpenAI resource, be sure to check out the&amp;nbsp;&lt;span&gt;full, official Microsoft guide &lt;/span&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/create-resource" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id="azure-open-ai-setup"&gt;Azure OpenAI Setup&lt;/h2&gt;&lt;h3&gt;Base Model&lt;/h3&gt;&lt;div&gt;This setting is for user interface efficiency only. It does not control which model Azure actually runs and this value never leaves your machine when Azure OpenAI service provider is selected. In this context, it is only used to adjust&amp;nbsp;UI defaults and available options to match the capabilities of the model you deployed in Azure.&lt;/div&gt;&lt;div&gt;Example: If your Azure deployment uses gpt-5, choosing gpt-5 as the base model here will unlock sliders like &lt;strong&gt;Verbosity &lt;/strong&gt;and &lt;strong&gt;Reasoning Effort&lt;/strong&gt;.&lt;/div&gt;&lt;h3&gt;Resource Name&lt;/h3&gt;&lt;div&gt;The &lt;strong&gt;Resource Name&lt;/strong&gt; entered when creating your Azure OpenAI resource in the portal (step 3, on the Azure &lt;strong&gt;Basics &lt;/strong&gt;page, if you were following the instructions above).&lt;/div&gt;&lt;div&gt;Example: &amp;quot;DevWork&amp;quot;.&lt;/div&gt;&lt;h3&gt;Deployment Name&lt;/h3&gt;&lt;div&gt;The &lt;strong&gt;Deployment Name &lt;/strong&gt;you gave when deploying your selected model (e.g. gpt-4.1, gpt-5, etc) in Azure AI Foundry (step 8 from above).&lt;/div&gt;&lt;div&gt;Example: &amp;quot;gpt5-4.1&amp;quot;&lt;/div&gt;&lt;h3&gt;API Version&lt;/h3&gt;&lt;div&gt;The Azure OpenAI APIs require an explicit api-version.&lt;/div&gt;&lt;div&gt;Example: &amp;quot;&lt;strong&gt;2024-10-21&lt;/strong&gt;&amp;quot; (for Chat/Completions).&lt;/div&gt;&lt;div&gt;CodeRush combines this with your Resource Name and Deployment Name to generate the full endpoint URL.&lt;/div&gt;&lt;div&gt;A preview of the constructed endpoint appears in the options dialog so you can verify everything looks correct.&lt;/div&gt;&lt;h3&gt;Max Response Tokens&lt;/h3&gt;&lt;div&gt;Same as described earlier — controls the maximum length of responses.&lt;/div&gt;&lt;div&gt;See earlier section: &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#max-response-tokens"&gt;Max Response Tokens&lt;/a&gt;.&lt;/div&gt;&lt;h3&gt;Token Pricing (Input/Output)&lt;/h3&gt;&lt;div&gt;Same as described earlier — used only by CodeRush to estimate cost per interaction.&lt;/div&gt;&lt;div&gt;See earlier section: &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#pricing"&gt;Token Pricing&lt;/a&gt;.&lt;/div&gt;&lt;h3&gt;Verbosity,&amp;nbsp;Reasoning Effort, and Temperature&lt;/h3&gt;&lt;div&gt;These sliders behave exactly as described earlier: Verbosity and Reasoning Effort are available in gpt-5&amp;nbsp;models and up. Temperature applies to gpt-4.1 and earlier.&lt;/div&gt;&lt;div&gt;See earlier sections: &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#verbosity"&gt;Verbosity &amp;amp;&amp;nbsp;Reasoning Effort&lt;/a&gt;, &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/09/08/advanced-ai-setup-for-aigen-and-aifind-in-coderush-for-visual-studio.aspx#temperature"&gt;Temperature&lt;/a&gt;.&lt;/div&gt;&lt;h2 id="quick-test"&gt;Quick Test&lt;/h2&gt;&lt;p&gt;Now with AI features enabled and an AI Service selected, it&amp;#39;s time to test out the new features.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;First, create a new C# project (e.g., console or WPF).&lt;/li&gt;&lt;li&gt;Place the caret inside some C# code.&lt;/li&gt;&lt;li&gt;If using voice, &lt;strong&gt;Tap &lt;/strong&gt;and &lt;strong&gt;hold &lt;/strong&gt;the &lt;strong&gt;right Ctrl key&lt;/strong&gt;&amp;nbsp;(like a double-tap) and say &lt;em&gt;&amp;quot;I need a new customer class with all the usual properties&amp;quot;&lt;/em&gt; (and &lt;strong&gt;release &lt;/strong&gt;the Ctrl key when&amp;nbsp;done speaking).&amp;nbsp;Alternatively, press &lt;strong&gt;Caps&lt;/strong&gt;+&lt;strong&gt;G &lt;/strong&gt;to invoke the &lt;strong&gt;CodeRush AiGen Prompt&lt;/strong&gt; window, enter the same text, and click &lt;strong&gt;Send&lt;/strong&gt;.&lt;br&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/AiGenPrompt.png" alt="" style="width:868px;height:350px;"&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;After a few moments, you should have a new class named &amp;quot;Customer&amp;quot; added to the project with properties for Name, Email, Address, etc.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/NewCustomerClass.png" alt="" style="width:1171px;height:678px;"&gt;&lt;/p&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Next Steps&lt;/h2&gt;&lt;div&gt;That’s it — you’re all set to start using CodeRush with AI assistance in Visual Studio. Give it a try and let us know how you like it! &lt;/div&gt;&lt;div&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=DevExpress.CodeRushforVS2022"&gt;Download CodeRush from the Visual Studio Marketplace&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Drop us a note anytime at support@devexpress.com. We love listening to your feedback.&lt;/div&gt;</description>
      <pubDate>Tue, 09 Sep 2025 16:00:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388250</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2025/06/24/aigen-amp-aifind-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/AI+Agents">AI Agents</category>
      <category domain="https://community.devexpress.com/Tags/AiFind">AiFind</category>
      <category domain="https://community.devexpress.com/Tags/AiGen">AiGen</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/GitHub+Copilot+Chat">GitHub Copilot Chat</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Commands">Voice Commands</category>
      <title>AiGen &amp; AiFind in CodeRush for Visual Studio</title>
      <description>&lt;p&gt;In the 25.1 release of CodeRush, we’re introducing two new features designed to radically improve how you write and find code — &lt;strong&gt;AiGen&lt;/strong&gt; and &lt;strong&gt;AiFind&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Built into CodeRush (a free extension for Visual Studio), AiGen and AiFind help you generate, modify, and navigate code using natural language prompts. These features bring the power of AI &lt;strong&gt;directly into your development environment&lt;/strong&gt;, delivering &lt;strong&gt;faster AI responses&lt;/strong&gt; at a &lt;strong&gt;lower cost&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;No separate tool windows, no context switching, no copying/pasting,&amp;nbsp;&lt;span&gt;no typing (using optional voice input),&amp;nbsp;&lt;/span&gt;and more focus on solving real problems.&lt;/p&gt;&lt;p&gt;Let’s dive in.&lt;/p&gt;&lt;h2&gt;Setup Notes&lt;/h2&gt;&lt;p&gt;Setup requires an OpenAI API key for AI features and an Azure Cognitive Services Speech API key for voice-to-text. Full setup details are &lt;a href="https://community.devexpress.com/Blogs/markmiller/archive/2024/03/05/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The instructions here are for voice prompts (which is the easiest way to code with AI), however if you prefer to type your prompts you can press &lt;strong&gt;Caps&lt;/strong&gt;+&lt;strong&gt;G&lt;/strong&gt;&amp;nbsp;to bring up the AiGen Prompt window (assuming you have enabled the CodeRush&amp;#39;s &lt;a href="https://docs.devexpress.com/CodeRushForRoslyn/403629/getting-started/keyboard-shortcuts/caps-as-a-modifier" target="_blank"&gt;Caps as a Modifier&lt;/a&gt; feature - if not you can &lt;a href="https://docs.devexpress.com/CodeRushForRoslyn/403628/getting-started/keyboard-shortcuts/shortcuts" target="_blank"&gt;create a new shortcut binding&lt;/a&gt; to the &lt;strong&gt;AiGenFromPrompt &lt;/strong&gt;command).&lt;/p&gt;&lt;h2&gt;AiGen - Your Coding Assistant is Really Here&lt;/h2&gt;&lt;p&gt;Just double-tap and hold the &lt;strong&gt;right&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Ctrl &lt;/strong&gt;key inside the Visual Studio editor, and say what you need (release the Ctrl key when you have finished your voice request). You can ask for new classes, new methods, XAML layout changes or styles, or modifications to existing code. AiGen will integrate the AI response directly with your existing code. Here are some of my favorite AiGen use cases:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Creating new classes&lt;/li&gt;&lt;li&gt;Creating test cases&lt;/li&gt;&lt;li&gt;Adding DebuggerDisplay[] attributes&lt;/li&gt;&lt;li&gt;Creating data entry forms&lt;/li&gt;&lt;li&gt;Changing a window/form&amp;#39;s&amp;nbsp;design&amp;nbsp;and its associated code behind in a single step&lt;/li&gt;&lt;li&gt;Modifying a group of methods or statements (e.g., consolidating/&lt;span&gt;optimizing/transforming&lt;/span&gt;&amp;nbsp;similar blocks of &lt;span&gt;code&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Upgrading legacy code to a more modern approach&amp;nbsp;(e.g., changing old test case asserts to fluent assertions)&lt;/li&gt;&lt;li&gt;Anything tedious so I stay focused on the big picture&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;AiGen can do almost anything you need, just ask. If&amp;nbsp;&lt;span&gt;AiGen can&amp;#39;t do it, it will let you know (I&amp;#39;ll include a limitations section below).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Let&amp;#39;s explore some practical examples.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;&lt;span&gt;Follow Along&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;In the upcoming examples, I&amp;#39;ll demonstrate sample prompts and responses. You might want to follow along and try these examples, however note that because we are using AI there is a certain non-deterministic element to these examples. Your results may vary. And AI results may not always be accurate.&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Debugger Display Attribute&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;This is one of my favorite examples, because it is the smallest change, but it demonstrates the speed and intelligence of AI even for a small change. Consider the following class in C#:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;public class Fraction {
    public int Numerator { get; set; }
    public int Denominator { get; set; }

    public Fraction(int numerator, int denominator) {
        if (denominator == 0) {
            throw new ArgumentException(&amp;quot;Denominator cannot be zero.&amp;quot;, nameof(denominator));
        }
        Numerator = numerator;
        Denominator = denominator;
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This class is a great start, but at debug time inspecting every instance will reveal the same value &amp;quot;&lt;code class="language-csharp"&gt;{ Fraction }&lt;/code&gt;&amp;quot;, regardless of what it contains. We need a &lt;code class="language-csharp"&gt;DebuggerDisplay&lt;/code&gt;&amp;nbsp;attribute so we can see the value for each instance &lt;span&gt;at a glance&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Place the caret inside this class, &lt;strong&gt;double-tap &lt;/strong&gt;and &lt;strong&gt;hold &lt;/strong&gt;the &lt;strong&gt;right&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;Ctrl &lt;/strong&gt;key and say something like &lt;em&gt;&amp;quot;Can I get a debugger display attribute?&amp;quot;.&lt;/em&gt;&amp;nbsp;As you speak you&amp;#39;ll see feedback that CodeRush is listening. After you release the Ctrl key, you should see the &amp;quot;&lt;strong&gt;Thinking...&lt;/strong&gt;&amp;quot; animation feedback. This means your query (along with pertinent context) has been sent to AI for processing. Within a few moments (about 5 seconds when I tried it just now) AiGen should insert an attribute into the code that looks like this:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp" data-line="1"&gt;[DebuggerDisplay(&amp;quot;{Numerator}/{Denominator}&amp;quot;)]
public class Fraction {
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is one of the things I love about working with AI -- you can supply a &lt;strong&gt;hint &lt;/strong&gt;of what you want and it &lt;strong&gt;regularly infers &lt;/strong&gt;and &lt;strong&gt;delivers exactly what you need&lt;/strong&gt;. And in this example, it&amp;#39;s in a place where there is no IntelliSense (inside the string parameter), so an error-prone location where precision and care must &lt;span&gt;otherwise&amp;nbsp;&lt;/span&gt;be used to avoid time-consuming&amp;nbsp;mistakes. Could I add this myself in five&amp;nbsp;seconds by hand? Unlikely. It would take nearly five seconds to just move the caret into the correct location.&lt;/p&gt;&lt;p&gt;You also might have noticed the AiGen Navigation&amp;nbsp;window appear:&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/AiNav%20-%20Fraction.png" alt="" style="width:701px;height:212px;"&gt;&lt;p&gt;This UI appears after any AiGen or AiFind query, and allows you to navigate through all the changes.&amp;nbsp; Since there was only one change in this example, we can close this window. You can also ignore it -- it will auto-close 10 seconds after making&amp;nbsp;any change in VS. Regardless, we will talk about this window later in this post.&lt;/p&gt;&lt;h2&gt;Adding Operator Overloads&lt;/h2&gt;&lt;p&gt;Let&amp;#39;s stay in the &lt;code class="language-csharp"&gt;Fraction&lt;/code&gt;&amp;nbsp;class for a moment. With the caret inside this class,&amp;nbsp;double-tap and hold the right Ctrl key and say: &amp;quot;&lt;em&gt;Can I get some math operator overloads?&lt;/em&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;After a moment you should see methods like the following inserted into your Fraction class:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp" data-line="4-34"&gt;[DebuggerDisplay(&amp;quot;{Numerator}/{Denominator}&amp;quot;)]
public class Fraction
{
	public static Fraction operator +(Fraction a, Fraction b)
	{
		int numerator = a.Numerator * b.Denominator + b.Numerator * a.Denominator;
		int denominator = a.Denominator * b.Denominator;
		return new Fraction(numerator, denominator);
	}

	public static Fraction operator -(Fraction a, Fraction b)
	{
		int numerator = a.Numerator * b.Denominator - b.Numerator * a.Denominator;
		int denominator = a.Denominator * b.Denominator;
		return new Fraction(numerator, denominator);
	}

	public static Fraction operator *(Fraction a, Fraction b)
	{
		int numerator = a.Numerator * b.Numerator;
		int denominator = a.Denominator * b.Denominator;
		return new Fraction(numerator, denominator);
	}

	public static Fraction operator /(Fraction a, Fraction b)
	{
		if (b.Numerator == 0)
		{
			throw new DivideByZeroException(&amp;quot;Cannot divide by a fraction with zero numerator.&amp;quot;);
		}
		int numerator = a.Numerator * b.Denominator;
		int denominator = a.Denominator * b.Numerator;
		return new Fraction(numerator, denominator);
	}
	public int Numerator { get; set; }
	public int Denominator { get; set; }

	public Fraction(int numerator, int denominator)
	{
		if (denominator == 0)
		{
			throw new ArgumentException(&amp;quot;Denominator cannot be zero.&amp;quot;, nameof(denominator));
		}

		Numerator = numerator;
		Denominator = denominator;
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Adding Test Cases&lt;/h2&gt;&lt;p&gt;With the new operator overloads, our improved &lt;code class="language-csharp"&gt;Fraction&lt;/code&gt;&amp;nbsp;class is easier to use. Now let&amp;#39;s verify that with some test cases. Double-tap and hold the right Ctrl key and say something like,&amp;nbsp;&lt;em&gt;&amp;quot;How about some test cases?&amp;quot;&lt;/em&gt;.&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/FractionTests.cs.png" alt="" style="width:326px;height:139px;"&gt;&lt;p&gt;And within seconds you should have a new class and file, FractionTests.cs, added to your project.&lt;/p&gt;&lt;p&gt;On my machine, with the NUnit framework already referenced, AI built&amp;nbsp;this:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp" data-line="9, 19, 29, 39, 55"&gt;[TestFixture]
public class FractionTests
{
    [Test]
    public void TestAddition()
    {
        var fraction1 = new Fraction(1, 2);
        var fraction2 = new Fraction(1, 3);
        var result = fraction1 + fraction2;
        Assert.AreEqual(5, result.Numerator);
        Assert.AreEqual(6, result.Denominator);
    }

    [Test]
    public void TestSubtraction()
    {
        var fraction1 = new Fraction(1, 2);
        var fraction2 = new Fraction(1, 3);
        var result = fraction1 - fraction2;
        Assert.AreEqual(1, result.Numerator);
        Assert.AreEqual(6, result.Denominator);
    }

    [Test]
    public void TestMultiplication()
    {
        var fraction1 = new Fraction(1, 2);
        var fraction2 = new Fraction(2, 3);
        var result = fraction1 * fraction2;
        Assert.AreEqual(2, result.Numerator);
        Assert.AreEqual(6, result.Denominator);
    }

    [Test]
    public void TestDivision()
    {
        var fraction1 = new Fraction(1, 2);
        var fraction2 = new Fraction(3, 4);
        var result = fraction1 / fraction2;
        Assert.AreEqual(4, result.Numerator);
        Assert.AreEqual(6, result.Denominator);
    }

    [Test]
    public void TestZeroDenominatorThrowsException()
    {
        Assert.Throws&amp;lt;ArgumentException&amp;gt;(() =&amp;gt; new Fraction(1, 0));
    }

    [Test]
    public void TestZeroNumeratorInDivisionThrowsException()
    {
        var fraction1 = new Fraction(1, 2);
        var fraction2 = new Fraction(0, 1);
        Assert.Throws&amp;lt;DivideByZeroException&amp;gt;(() =&amp;gt; fraction1 / fraction2);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Notice in the highlighted lines above where we are exercising our new operator overloads&lt;/p&gt;&lt;h2&gt;Legacy Code and New Frameworks&lt;/h2&gt;&lt;p&gt;To upgrade legacy code or use a new framework, open that file and simply say what you need. For example, in the test class we just created, we might want to convert all those Assert.AreEqual calls to something more fluent.&lt;/p&gt;&lt;p&gt;&lt;span&gt;For example, double-tap and hold the right Ctrl key and say something like,&amp;nbsp;&lt;/span&gt;&lt;em&gt;&amp;quot;Hey, can we convert all these Assert.AreEqual&amp;nbsp;calls to Assert.That calls?&amp;quot;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Within seconds, AiGen changes every method in the class to look like this:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp" data-line="10-11, 20-21, 30-31, 40-41"&gt;[TestFixture]
public class FractionTests
{
    [Test]
	public void TestAddition()
	{
		var fraction1 = new Fraction(1, 2);
		var fraction2 = new Fraction(1, 3);
		var result = fraction1 + fraction2;
		Assert.That(result.Numerator, Is.EqualTo(5));
		Assert.That(result.Denominator, Is.EqualTo(6));
	}

    [Test]
	public void TestSubtraction()
	{
		var fraction1 = new Fraction(1, 2);
		var fraction2 = new Fraction(1, 3);
		var result = fraction1 - fraction2;
		Assert.That(result.Numerator, Is.EqualTo(1));
		Assert.That(result.Denominator, Is.EqualTo(6));
	}

    [Test]
	public void TestMultiplication()
	{
		var fraction1 = new Fraction(1, 2);
		var fraction2 = new Fraction(2, 3);
		var result = fraction1 * fraction2;
		Assert.That(result.Numerator, Is.EqualTo(2));
		Assert.That(result.Denominator, Is.EqualTo(6));
	}

    [Test]
	public void TestDivision()
	{
		var fraction1 = new Fraction(1, 2);
		var fraction2 = new Fraction(3, 4);
		var result = fraction1 / fraction2;
		Assert.That(result.Numerator, Is.EqualTo(4));
		Assert.That(result.Denominator, Is.EqualTo(6));
	}

    [Test]
    public void TestZeroDenominatorThrowsException()
    {
        Assert.Throws&amp;lt;ArgumentException&amp;gt;(() =&amp;gt; new Fraction(1, 0));
    }

    [Test]
    public void TestZeroNumeratorInDivisionThrowsException()
    {
        var fraction1 = new Fraction(1, 2);
        var fraction2 = new Fraction(0, 1);
        Assert.Throws&amp;lt;DivideByZeroException&amp;gt;(() =&amp;gt; fraction1 / fraction2);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Undo and Redo in a Single Step&lt;/h2&gt;&lt;p&gt;Now might be a good time to take a look at the undo stack.&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/UndoMenu3.png" alt="" style="width:556px;height:185px;"&gt;&lt;p&gt;Notice that every AiGen operation is prefixed and labeled, explaining each change. AiGen operations, even those spanning multiple files and locations, will appear as a single entry in the stack and can be easily undone (or redone) in a single step.&lt;/p&gt;&lt;p&gt;When you redo an AiGen operation, the Navigator reappears so you can see a summary of changes.&lt;/p&gt;&lt;h2&gt;Creating A New Class&lt;/h2&gt;&lt;p&gt;Creating a new class is easy. Just double-tap and hold the right Ctrl key and say something like this: &amp;quot;&lt;em&gt;I need a new class named user with properties for first name, last name, and birth date. And I would like a unique ID property that&amp;#39;s set to a new guid any time an instance is created.&lt;/em&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;If you&amp;#39;re following along, try this in a new WPF application. AI builds this new class, wrapping it in the default project namespace,&amp;nbsp;and adds its file to the project:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;using System;

namespace WpfDX {
    public class User {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime BirthDate { get; set; }
        public Guid UniqueID { get; }

        public User() {
            UniqueID = Guid.NewGuid();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note&amp;nbsp;we&amp;#39;re increasing the complexity a bit, providing multiple specifications to describe the code we want in the same prompt.&lt;/p&gt;&lt;h2&gt;Creating a User Interface&lt;/h2&gt;&lt;p&gt;Now, let&amp;#39;s copy this class to the clipboard. Placing a class on the clipboard is one way to let AI know you want to work with this class. To quickly copy this class to the clipboard, place the caret on the first&amp;nbsp;&lt;code class="language-csharp"&gt;public&lt;/code&gt;&amp;nbsp;keyword (on&amp;nbsp;the class declaration) and press &lt;strong&gt;Ctrl&lt;/strong&gt;+&lt;strong&gt;C&lt;/strong&gt;. If&amp;nbsp;you have CodeRush&amp;#39;s &lt;a href="https://docs.devexpress.com/CodeRushForRoslyn/400583/coding-assistance/clipboard-tools/smart-cut-and-copy" target="_blank"&gt;smart copy&lt;/a&gt; feature enabled, the entire class will be selected and placed on the clipboard.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Next, switch to the MainWindow.xaml file. In my sample project, my XAML looks like this (I&amp;#39;ve created a &lt;code class="language-csharp"&gt;DockPanel&lt;/code&gt;&amp;nbsp;on line 9, but if yours is showing a&amp;nbsp;&lt;code class="language-csharp"&gt;Grid&lt;/code&gt; that&amp;#39;s fine too):&lt;/p&gt;&lt;pre&gt;&lt;code class="language-xml" data-line="9"&gt;&amp;lt;Window x:Class=&amp;quot;WpfDX.MainWindow&amp;quot;
		xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;
		xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;
		xmlns:d=&amp;quot;http://schemas.microsoft.com/expression/blend/2008&amp;quot;
		xmlns:mc=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;
		xmlns:local=&amp;quot;clr-namespace:WpfDX&amp;quot;
		mc:Ignorable=&amp;quot;d&amp;quot;
		Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;450&amp;quot; Width=&amp;quot;800&amp;quot;&amp;gt;
	&amp;lt;DockPanel/&amp;gt;
&amp;lt;/Window&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;span&gt;For reference, my code-behind file starts off relatively empty, looking like this:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;using System;
using System.Windows;

namespace WpfDX {
	public partial class MainWindow : Window {
		public MainWindow() {
			InitializeComponent();
		}
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;ouble-tap and hold the right Ctrl key and say&amp;nbsp;&lt;em&gt;&amp;quot;I want to create a data table for the user class, which I&amp;#39;ve placed on the&amp;nbsp;&lt;strong&gt;clipboard&lt;/strong&gt;. Can we populate this form with, say 50 users filled with sample data?&amp;quot;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;After a few seconds, changes should be integrated in both the XAML&amp;nbsp;and the code behind, and the AiGen Navigator appears. My version for this demo looks like this:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/AiNav%20-%20User%20data%20table.png" alt="" style="width:701px;height:284px;"&gt;&lt;/p&gt;&lt;h2&gt;The AiGen/AiFind Navigator&lt;/h2&gt;&lt;p&gt;The Navigator window provides a summary of all code changes in this operation in the &lt;strong&gt;Results&lt;/strong&gt; tree view on the left. In my screenshot above, it shows three changes to my code behind file (&lt;span&gt;MainWindow.xaml.cs&lt;/span&gt;), and one change to my designer file (MainWindow.xaml).&lt;/p&gt;&lt;p&gt;Each change is prefixed by an icon that shows whether it&amp;#39;s an addition (plus symbol), a change (a delta symbol), or a deletion (minus &lt;span&gt;symbol&lt;/span&gt;). You can click on a change and the Navigator will highlight that change in the code, or you can press &lt;strong&gt;F7 &lt;/strong&gt;and &lt;strong&gt;F8 &lt;/strong&gt;to navigate backward&amp;nbsp;and forward through&amp;nbsp;the results. &lt;/p&gt;&lt;p&gt;Tip: If the change is large and does not fit onscreen, you can turn on &lt;strong&gt;Selection Previews &lt;/strong&gt;to see both the top and bottom of the selection (open the CodeRush &lt;strong&gt;Options &lt;/strong&gt;window and navigate to the &amp;quot;&lt;strong&gt;Editor&lt;/strong&gt;-&amp;gt;&lt;strong&gt;All Languages&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Selection&lt;/strong&gt;&amp;quot; options page.&lt;/p&gt;&lt;p&gt;&lt;span&gt;Feel free to explore the changes by clicking on the results, or &lt;strong&gt;Run&lt;/strong&gt; your application. I got this:&lt;/span&gt;&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/Running%20User%20Data%20Table.png" alt="" style="width:534px;height:211px;"&gt;&lt;p&gt;Not bad for zero lines of hand-written code. &lt;/p&gt;&lt;p&gt;As an expert in UI,&amp;nbsp;I&amp;#39;m immediately noticing that the border contrast is&amp;nbsp;too high.&amp;nbsp;We&amp;#39;ll upgrade to a more professional look in a minute, but before we go there, let&amp;#39;s dive into the &lt;strong&gt;Difference View&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;The Difference View&lt;/h2&gt;&lt;p&gt;Often it&amp;#39;s sufficient to navigate to the change. But sometimes its useful to see a difference. If a difference view is available, the &amp;quot;&lt;strong&gt;Show Difference View&lt;/strong&gt;&amp;quot; button will be available (turned off by default to conserve screen space). Click this button (or press &lt;strong&gt;F9&lt;/strong&gt;).&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/DeltaXaml.png" alt="" style="width:638px;height:284px;"&gt;&lt;p&gt;You can see in the Difference View (diff view) above, CodeRush has opened up the &lt;code class="language-csharp"&gt;&amp;lt;DockPanel&amp;gt;&lt;/code&gt;&amp;nbsp;tag and added a single&amp;nbsp;&lt;code class="language-csharp"&gt;DataGrid&lt;/code&gt; child.&lt;/p&gt;&lt;p&gt;Once you turn on the Difference View, it stays on until the Navigator is closed. You can always hide it in the right-click context menu.&lt;/p&gt;&lt;h2&gt;Triggered Prompts&lt;/h2&gt;&lt;p&gt;You may recall in our last example &lt;span&gt;to create the data table&amp;nbsp;&lt;/span&gt;we used the word &lt;em&gt;&amp;quot;&lt;strong&gt;clipboard&lt;/strong&gt;&amp;quot;&lt;/em&gt; in our prompt.&amp;nbsp;When CodeRush matches certain regular expression triggers to your spoken/written prompts, it can&amp;nbsp;send additional instructions to AI. In this case, it sent&amp;nbsp;the clipboard &lt;span&gt;contents&amp;nbsp;&lt;/span&gt;as part of a rich context, so AI can generate the highest&amp;nbsp;quality code. &lt;/p&gt;&lt;p&gt;You have full control over this behavior (and other triggered prompt modifications) on the &amp;quot;&lt;span&gt;&lt;strong&gt;Triggered Prompts&lt;/strong&gt;&amp;quot; options page (o&lt;/span&gt;pen the CodeRush &lt;strong&gt;Options window &lt;/strong&gt;and navigate to the &amp;quot;&lt;strong&gt;IDE&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Cognitive&lt;/strong&gt;&amp;quot;&amp;nbsp;section&amp;nbsp;to find it).&lt;/p&gt;&lt;p&gt;You can use Triggered Prompts to provide conditional instructions, or &amp;quot;always on&amp;quot; instructions (just set the trigger to the universal regular expression matching pattern &amp;quot;.*&amp;quot;).&lt;/p&gt;&lt;h2&gt;Taking it to the Next Level&lt;/h2&gt;&lt;p&gt;So far we&amp;#39;ve created a data table with some sample data. Next I&amp;#39;m going to switch over to the&amp;nbsp;&lt;strong&gt;MainWindow.xaml &lt;/strong&gt;file,&amp;nbsp;&lt;span&gt;double-tap and hold the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;right&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Ctrl&amp;nbsp;&lt;/strong&gt;&lt;span&gt;key, and say &amp;quot;&lt;em&gt;I&amp;#39;d like to convert these controls over to their DevExpress equivalents.&lt;/em&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;Follow along if you have the DevExpress controls installed. If not, you can download a &lt;a href="https://www.devexpress.com/products/try/" target="_blank"&gt;free trial here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For me, this request took about 20 seconds. When it completed, the first thing I noticed was&amp;nbsp;an &amp;quot;Invalid Markup&amp;quot; message in the XAML. But not to worry, because the AiGen Navigator is up and it&amp;#39;s presenting&amp;nbsp;a NuGet package install page.&lt;/p&gt;&lt;h2&gt;Installing NuGet Packages&lt;/h2&gt;&lt;p&gt;The NuGet Packages page&amp;nbsp;&lt;span&gt;lets you install packages needed to support the AI generated changes.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/Install%20NuGet%20Packages.png" alt="" style="width:701px;height:314px;"&gt;&lt;/p&gt;&lt;p&gt;I can just click these &lt;strong&gt;Install&lt;/strong&gt; buttons to start the NuGet package install. You can install these packages in any order (and you can certainly choose not to install at all).&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/Installing%20NuGet.png" alt="" style="width:701px;height:284px;"&gt;&lt;/p&gt;&lt;p&gt;The Navigator confirms successful installation by placing checkmarks next to each package:&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/Packages%20Installed.png" alt="" style="width:701px;height:284px;"&gt;&lt;p&gt;As soon as these packages finish installing, the XAML designer preview updates showing the DevExpress controls. The designer preview now looks like this:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/WeHaveAGridControl.png" alt="" style="width:464px;height:193px;"&gt;&lt;/p&gt;&lt;p&gt;Excellent. This may be a good time for a reminder&amp;nbsp;that we haven&amp;#39;t typed any lines of code yet. Before we run, let&amp;#39;s return to the AiGen Navigator and take a closer look at the changes.&lt;/p&gt;&lt;h2&gt;AI Conversion&amp;nbsp;to DevExpress Controls&lt;/h2&gt;&lt;p&gt;If you&amp;#39;ve been following along with our example, so far we&amp;#39;ve created a new &lt;code class="language-csharp"&gt;User&lt;/code&gt;&amp;nbsp;class, we created a &lt;code&gt;DataGrid&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and initialized it with sample data. Next we converted our application to use DevExpress controls instead of the ordinary WPF controls that come with .NET. &lt;/p&gt;&lt;p&gt;In my example, the Navigator shows two changes to the XAML&amp;nbsp;and one to the code behind (interesting!). First, let&amp;#39;s look at the XAML changes using the Diff View (&lt;strong&gt;F9&lt;/strong&gt;&amp;nbsp;to toggle).&lt;/p&gt;&lt;p&gt;First, you can see AiGen removed the &lt;code class="language-csharp"&gt;DataGrid&lt;/code&gt;&amp;nbsp;control and replaced it with a &lt;code class="language-csharp"&gt;GridControl&lt;/code&gt;&amp;nbsp;that&amp;#39;s parenting a &lt;code class="language-csharp"&gt;TableView&lt;/code&gt;. Careful readers may also notice in my screen shot that it &lt;strong&gt;renamed &lt;/strong&gt;the grid control to &amp;quot;userGridControl&amp;quot; (another interesting choice).&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/ConversionToDevExControls.png" alt="" style="width:1196px;height:620px;"&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;It also added the &lt;strong&gt;dxg &lt;/strong&gt;namespace (you can see this by clicking the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;xmlns:dxg&lt;/strong&gt;&lt;span&gt;&amp;nbsp;attribute entry in the Navigator tree view.&lt;/span&gt;&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/AttributeNamespace.png" alt="" style="width:1508px;height:522px;"&gt;&lt;p&gt;The last change is in the code behind. Using &lt;strong&gt;F8 &lt;/strong&gt;(or simply clicking) to navigate to this change, the diff view reveals why the code behind was changed.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/LoadUserDataChanges.png" alt="" style="width:962px;height:381px;"&gt;&lt;/p&gt;&lt;p&gt;Ah... perfect. It renamed the control on the designer to match the new DevExpress WPF control type, and also updated the reference in the code behind. Nice.&lt;/p&gt;&lt;p&gt;I should point out that AI may not get it right every time. Sometimes you may have to make minor adjustments to the code or undo altogether (you can also click the &lt;strong&gt;Edit Prompt &lt;/strong&gt;button on the Navigator if you want to try again).&lt;/p&gt;&lt;h2&gt;Trying Out the New&amp;nbsp;Application&lt;/h2&gt;&lt;p&gt;So far we used AI to&amp;nbsp;convert&amp;nbsp;our&amp;nbsp;&lt;code&gt;DataGrid&lt;/code&gt;&lt;span&gt;&amp;nbsp;to a DevExpress &lt;/span&gt;&lt;code&gt;GridControl&lt;/code&gt;&lt;span&gt;&amp;nbsp;. Now it&amp;#39;s time to see it in action. Run the application and try it out. Here&amp;#39;s what I have:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/NewDevExLook.png" alt="" style="width:509px;height:220px;"&gt;&lt;/p&gt;&lt;p&gt;The default cell border contrast with the DevExpress controls is already better out of the box.&lt;/p&gt;&lt;h2&gt;AiFind - Your AI-Powered Search&lt;/h2&gt;&lt;p&gt;&lt;span&gt;Just double-tap and hold the&amp;nbsp;&lt;/span&gt;right&amp;nbsp;Ctrl&amp;nbsp;&lt;span&gt;key inside the Visual Studio editor in the file you want to search, and state what you are looking for. For example, you&amp;nbsp;might say &lt;em&gt;&amp;quot;I&amp;#39;m looking for &lt;/em&gt;&lt;em&gt;security issues in this code.&amp;quot;&lt;/em&gt; or &lt;em&gt;&amp;quot;Show me any methods involved in preparing an order for processing&amp;quot;&lt;/em&gt; or &lt;em&gt;&amp;quot;I need to see any buttons that do not yet have a style assigned&amp;quot;&lt;/em&gt;. AiFind will search the active file and highlight the code elements satisfying your search in the AiFind Navigator.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/AiGen%20&amp;amp;%20AiFind/AiFind.png" alt="" style="width:1478px;height:430px;"&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;F8 &lt;/strong&gt;and &lt;strong&gt;F7&lt;/strong&gt; shortcuts (for Next/Previous AiFind result) are really useful &lt;span&gt;for high-speed navigation&lt;/span&gt;.&lt;/p&gt;&lt;h2&gt;Limitations&lt;/h2&gt;&lt;p&gt;As with anything involving AI, there are some limitations to what AI assistance can do in this release.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;AiFind currently works in the active file.&lt;/li&gt;&lt;li&gt;C# and XAML code folding agents are supplied&lt;/li&gt;&lt;li&gt;You can &lt;span&gt;create new types contained in their own files, but there is no&amp;nbsp;&lt;/span&gt;ability yet to create new files holding other non-C# type content.&lt;/li&gt;&lt;li&gt;Cannot delete files or remove files from the project.&lt;/li&gt;&lt;li&gt;&lt;span&gt;Aside from installing NuGet packages, you cannot modify the project file or the solution file (so no way to create or add new projects).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Cannot perform refactorings on references spanning multiple files (use solid refactoring tools for this instead).&lt;/li&gt;&lt;li&gt;Contextual code awareness is currently limited to designer + code behind + clipboard (if you mention &amp;quot;clipboard&amp;quot; in your prompt), plus a project overview (language, framework, ui framework, and references).&lt;/li&gt;&lt;li&gt;There are the usual limitations and disclaimers on the power of AI itself. Sometimes AI &amp;quot;hallucinates&amp;quot; (this is especially true when generating code based on frameworks that have changed or&amp;nbsp;where the API has broken&amp;nbsp;over time). Also, it is possible to have a request that is so complex AI has difficulty implementing it correctly.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;More Voice Features&lt;/h2&gt;&lt;div&gt;CodeRush contains powerful features for voice interaction in Visual Studio. Other posts documenting voice features in CodeRush:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Setup&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-to-code-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice to Code&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/05/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Comment Dictation&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;String Dictation&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/06/03/github-copilot-chat-voice-support-with-coderush-for-visual-studio.aspx" target="_blank"&gt;Copilot Voice Support&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/12/16/voice-input-modes-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Input Modes&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 24 Jun 2025 07:09:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
      <dx:excerpt>In the 25.1 release of CodeRush, we’re introducing two new features designed to radically improve how you write and find code — AiGen and AiFind.</dx:excerpt>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388157</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2024/12/16/voice-input-modes-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+to+Code">Voice to Code</category>
      <title>Voice Input Modes in CodeRush for Visual Studio</title>
      <description>&lt;p&gt;CodeRush versions 24.1.5 and up add dynamically selectable Input Modes to its&amp;nbsp;Voice to Code technology, useful for dictating mixed-mode code expressions, such as code expressions that include &lt;strong&gt;string literals&lt;/strong&gt; or &lt;strong&gt;undeclared identifiers&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;Background&lt;/h2&gt;&lt;p&gt;CodeRush&amp;#39;s Voice to Code features include  dedicated Input Modes selected automatically based on context. For example, if voice features are used inside a &lt;strong&gt;string literal&lt;/strong&gt;, dictation mode is active and your spoken words (along with spaces, sentence capitalization, punctuation, etc.) will appear inside the string. A summary of the three primary input modes is summarized below:&lt;/p&gt;&lt;img src="https://community.devexpress.com:443/blogs/markmiller/Images/Voice2/ExistingVoiceInputModesSummary.png" alt="" style="width:382px;height:114.6px;"&gt;&lt;h2&gt;User-activated Input Modes&lt;/h2&gt;&lt;p&gt;Users can change the input mode while talking by pressing a modifier key (such as &lt;strong&gt;Alt&lt;/strong&gt; or &lt;strong&gt;Shift&lt;/strong&gt;), allowing a subset of the spoken words to be interpreted according to that newly activated input mode. Any words spoken while one or both of these&amp;nbsp;&lt;span&gt;modifier keys are held down will be interpreted with the specified alternate input mode.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;For example, if the caret is inside a string and dictation mode is active, the user can hold down the &lt;strong&gt;Alt &lt;/strong&gt;key to convert their spoken words to an &lt;strong&gt;interpolated string symbol/expression reference &lt;/strong&gt;(&lt;span&gt;see&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/05/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;string dictation&lt;/a&gt; for &lt;span&gt;more details&lt;/span&gt;). Or if&amp;nbsp;&lt;span&gt;the caret is inside an XML Documentation Comment, and dictation mode is active, the user can hold down the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Alt&amp;nbsp;&lt;/strong&gt;&lt;span&gt;key to reference&amp;nbsp;a symbol (e.g., a parameter to the method, another member, or another class), and CodeRush will insert the appropriate &lt;strong&gt;&amp;lt;cref&amp;gt;&lt;/strong&gt; or &lt;strong&gt;&amp;lt;paramref&amp;gt; &lt;/strong&gt;tags for that symbol (see&amp;nbsp;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/05/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;comment dictation&lt;/a&gt; for more details).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In both examples, simply&amp;nbsp;hold a modifier key down while speaking the words that need the alternate interpretation.&lt;/p&gt;&lt;h2&gt;New in this Release&lt;/h2&gt;&lt;p&gt;CodeRush adds additional switchable input modes in this release, allowing you to create &lt;strong&gt;new identifiers&lt;/strong&gt;&amp;nbsp;(hold down the &lt;strong&gt;Alt&lt;/strong&gt; key) and &lt;strong&gt;string literals&lt;/strong&gt; &lt;span&gt;(hold down the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Shift&lt;/strong&gt;&lt;span&gt;&amp;nbsp;key)&amp;nbsp;&lt;/span&gt;in voice-to-code.&lt;/p&gt;&lt;p&gt;&lt;span&gt;Specific examples of the new modes follow in the sections below.&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Here&amp;#39;s a&amp;nbsp;summary of currently supported user-activated modes:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com:443/blogs/markmiller/Images/Voice2/AltShiftInputModeSummary.png" alt="" style="width:551px;height:210.096px;"&gt;&lt;/p&gt;&lt;h2 id="shift-key-for-string-literals"&gt;Shift Key for String Literals&lt;/h2&gt;&lt;div&gt;If you need a string literal in your voice-to-code session, hold down the &lt;strong&gt;Shift &lt;/strong&gt;key while talking.&lt;/div&gt;&lt;div&gt;For example, to adorn a unit test method with a new &lt;strong&gt;Category &lt;/strong&gt;attribute for a category named &amp;quot;&lt;strong&gt;Core&lt;/strong&gt;&amp;quot;, you first position the caret inside square brackets ([]). This tells CodeRush you want to dictate an Attribute.&amp;nbsp;Then hold down the right &lt;strong&gt;Ctrl &lt;/strong&gt;key and say &lt;em&gt;&amp;quot;Category &lt;strong&gt;Core&lt;/strong&gt;&amp;quot;&lt;/em&gt;, also holding down the &lt;strong&gt;Shift &lt;/strong&gt;key while saying the word &lt;em&gt;&amp;quot;&lt;strong&gt;Core&lt;/strong&gt;&amp;quot;&lt;/em&gt;. CodeRush will generate the following attribute with the string literal &lt;code class="language-csharp"&gt;&amp;quot;Core&amp;quot;&lt;/code&gt;&amp;nbsp;for your test case:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;[Category(&amp;quot;Core&amp;quot;)]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For another example,&amp;nbsp;consider the following code:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;public Customer CreateCustomer(string name, int id) {
    return new Customer(name, id, DateTime.UtcNow);
}

public void CreateTestCustomers() {
    var testCustomer = ;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With the caret on line containing the incomplete assignment to &lt;code class="language-csharp"&gt;testCustomer&lt;/code&gt;&amp;nbsp;(before the semicolon), hold down the&amp;nbsp;&lt;strong&gt;right&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Ctrl&amp;nbsp;&lt;/strong&gt;key to start the voice-to-code session, and say&amp;nbsp;&lt;em&gt;&amp;quot;Create Customer with &lt;strong&gt;John Smith&lt;/strong&gt; and forty two&amp;quot;&lt;/em&gt;, also holding down the&amp;nbsp;&lt;strong&gt;Shift&amp;nbsp;&lt;/strong&gt;key while saying the words&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;John Smith&lt;/strong&gt;&amp;quot;&lt;/em&gt;. CodeRush will generate the following expression for the assignment that includes the string literal &lt;code class="language-csharp"&gt;&amp;quot;John Smith&amp;quot;&lt;/code&gt;:&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;public void CreateTestCustomers() {
    var testCustomer = CreateCustomer(&amp;quot;John Smith&amp;quot;, 42);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can even create code like this entire line (e.g., declare&amp;nbsp;the new variable initialized with a method &lt;span&gt;call having&amp;nbsp;&lt;/span&gt;a string literal as an argument)&amp;nbsp;in a single voice-to-code session (more on this below).&lt;/p&gt;&lt;h2 id="alt-key-for-new-identifiers"&gt;Alt Key for New Identifiers&lt;/h2&gt;&lt;div&gt;If you need to reference a&amp;nbsp;yet-to-be-declared identifier, hold down the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;key while speaking the words of the new identifier name. As an example, consider the following code:&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;void GetPercentOfTotal(double num1, double num2, double percent, out double answer) {  
}&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;To declare a new variable called &lt;code class="language-csharp"&gt;totalSum&lt;/code&gt;, and assign it the sum of&amp;nbsp;&lt;code class="language-csharp"&gt;num1&lt;/code&gt; and &lt;code class="language-csharp"&gt;num2&lt;/code&gt;, just say&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;total sum&amp;nbsp;&lt;/strong&gt;gets num one plus num two&amp;quot;&lt;/em&gt;&amp;nbsp;(hold down the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;key while saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;total sum&lt;/strong&gt;&amp;quot;&lt;/em&gt;). CodeRush will declare the&amp;nbsp;&lt;code class="language-csharp"&gt;totalSum&lt;/code&gt; variable and initialize it with the following code:&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;var totalSum = num1 + num2&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;Continuing the example in this method, on the next line you could say&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;temp answer&lt;/strong&gt;&amp;nbsp;gets total sum times percent&amp;quot;&lt;/em&gt;&amp;nbsp;(holding down the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;key while saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;temp answer&lt;/strong&gt;&amp;quot;&lt;/em&gt;) to generate this code:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;var tempAnswer = totalSum * percent&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Declaring new variables by voice also works with&amp;nbsp;&lt;code class="language-csharp"&gt;ref&lt;/code&gt; and&amp;nbsp;&lt;code class="language-csharp"&gt;out&lt;/code&gt; parameters. For example, consider the following code:&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;public bool TimeIsValid(string accountingPeriod) {

}&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;If the caret is inside the method and the spoken words are&amp;nbsp;&lt;em&gt;&amp;quot;date time try parse accounting period&amp;nbsp;&lt;strong&gt;result&lt;/strong&gt;&amp;quot;&lt;/em&gt;&amp;nbsp;(and the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;key is held down while speaking the word&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;result&lt;/strong&gt;&amp;quot;&lt;/em&gt;), CodeRush will generate the following code, declaring a new variable named&amp;nbsp;&lt;code class="language-csharp"&gt;result&lt;/code&gt; as an&amp;nbsp;&lt;code class="language-csharp"&gt;out&lt;/code&gt; parameter, like this:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;DateTime.TryParse(accountingPeriod, out var result)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;If you want your undeclared identifier to be a&amp;nbsp;&lt;strong&gt;method call&lt;/strong&gt;, release the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;key after you say the method name and follow it with the spoken keyword&amp;nbsp;&lt;em&gt;&amp;quot;with&amp;quot;&lt;/em&gt;&amp;nbsp;along with any optional arguments you want to pass to the method. If the new method call will have no arguments you can end the spoken phrase with the word&amp;nbsp;&lt;em&gt;&amp;quot;with&amp;quot;&lt;/em&gt;.&lt;/div&gt;&lt;p&gt;For example, with the caret inside the body of a method, you can say&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;i&lt;/strong&gt;&lt;strong&gt;nitialize core engines&lt;/strong&gt;&amp;nbsp;with&amp;quot;&lt;/em&gt;&amp;nbsp;(holding down the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;key while saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;initialize core engines&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&amp;quot;&lt;/em&gt;) to generate the following call to the specified undeclared method:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;InitializeCoreEngines()&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As another example, consider the following code:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;void CertifyProficiency(string name, Guid id) {
    var student1 =  ; 
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Inside the method before the semicolon, hold down the&amp;nbsp;&lt;strong&gt;right Ctrl&amp;nbsp;&lt;/strong&gt;key to start a voice-to-code session, and say&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;create student&amp;nbsp;&lt;/strong&gt;with name and I.D.&amp;quot;&lt;/em&gt;, holding down the&amp;nbsp;&lt;strong&gt;Alt&amp;nbsp;&lt;/strong&gt;key while speaking the words&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;create student&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&amp;quot;&lt;/em&gt;, CodeRush will create a new method call with the specified arguments, like this:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;void CertifyProficiency(string name, Guid id) {
    var student1 = CreateStudent(name, id);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that the&amp;nbsp;&lt;strong&gt;Alt&amp;nbsp;&lt;/strong&gt;key is only needed when referencing&amp;nbsp;&lt;strong&gt;undeclared&amp;nbsp;&lt;/strong&gt;methods and variables in speech. To call existing methods, simply refer to them by name while speaking (with only the&amp;nbsp;&lt;strong&gt;right Ctrl&amp;nbsp;&lt;/strong&gt;key down).&lt;/p&gt;&lt;h2&gt;Using the New Modifiers Together&lt;/h2&gt;&lt;div&gt;You can use the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong&gt;Shift&lt;/strong&gt;&amp;nbsp;modifiers in a single spoken phrase.&lt;/div&gt;&lt;div&gt;For example, if the spoken words are&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;display message&lt;/strong&gt;&amp;nbsp;gets&amp;nbsp;&lt;strong&gt;hello world&lt;/strong&gt;&amp;quot;&lt;/em&gt;, and you hold down the&amp;nbsp;&lt;strong&gt;Alt&amp;nbsp;&lt;/strong&gt;key while saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;display message&lt;/strong&gt;&amp;quot;&lt;/em&gt;, and later hold the&amp;nbsp;&lt;strong&gt;Shift&lt;/strong&gt;&amp;nbsp;key down while saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;hello world&lt;/strong&gt;&amp;quot;&lt;/em&gt;, CodeRush declares a new variable named &lt;code class="language-csharp"&gt;displayMessage&lt;/code&gt;,&amp;nbsp;initializing it to the literal string&amp;nbsp;&lt;code class="language-csharp"&gt;&amp;quot;hello world.&amp;quot;&lt;/code&gt; like this:&lt;/div&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;var displayMessage = &amp;quot;hello world.&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For a more sophisticated example, consider the following code:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;public Customer CreateCustomer(string name, int id) {
    return new Customer(name, id, DateTime.UtcNow);
}

public void CreateTestCustomers() {
    ; 
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With the caret before the semicolon in the&amp;nbsp;&lt;strong&gt;CreateTestCustomers&amp;nbsp;&lt;/strong&gt;method, try saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;test customer one&amp;nbsp;&lt;/strong&gt;gets create customer with&amp;nbsp;&lt;strong&gt;Jackie Smith&amp;nbsp;&lt;/strong&gt;and one seventy two&amp;quot;&lt;/em&gt;, holding down the&amp;nbsp;&lt;strong&gt;Alt&lt;/strong&gt;&amp;nbsp;key while saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;test customer one&lt;/strong&gt;&amp;quot;&lt;/em&gt;, and later hold the&amp;nbsp;&lt;strong&gt;Shift&lt;/strong&gt;&amp;nbsp;key down while saying&amp;nbsp;&lt;em&gt;&amp;quot;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;Jackie Smith&lt;/strong&gt;&lt;/em&gt;&amp;nbsp;&lt;/strong&gt;&amp;quot;&lt;/em&gt;, CodeRush will generate the following code:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-csharp"&gt;var testCustomerOne = CreateCustomer(&amp;quot;Jackie Smith&amp;quot;, 172)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this example CodeRush declares a new variable (&lt;code class="language-csharp"&gt;testCustomerOne&lt;/code&gt;), creates the assignment statement (from the word&amp;nbsp;&lt;em&gt;&amp;quot;gets&amp;quot;&lt;/em&gt;) and passes in the string literal&amp;nbsp;&lt;code class="language-csharp"&gt;Jackie Smith&lt;/code&gt;as an argument to the&amp;nbsp;&lt;code class="language-csharp"&gt;CreateCustomer()&lt;/code&gt; method.&lt;/p&gt;&lt;h2&gt;Usability Tips&lt;/h2&gt;&lt;p&gt;Using voice with modifier keys to dynamically change the input mode while talking can seem a bit tricky at first. Here are some suggestions to make approaching this easier:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create code in small pieces (shorter voice-to-code sessions). You don&amp;#39;t have to create an entire line of code in a single session.&lt;/li&gt;&lt;li&gt;Take it easy. It&amp;#39;s okay to pause while talking as you transition modifier&amp;nbsp;keys between an up or down state.&lt;/li&gt;&lt;li&gt;Don&amp;#39;t worry about precision. CodeRush is fairly tolerant of early/lagging modifier key presses and releases, so they don&amp;#39;t have to occur right at the small pauses between the spoken words. As long as the transition occurs after the middle of the preceeding word, and before the middle of the next spoken word, CodeRush will snap the time of transition to the point between the two words.&lt;/li&gt;&lt;li&gt;You can invoke an alternate input mode exclusively for an entire voice-to-code session. So for example, if you need a string literal at the caret, you can hold down both the&amp;nbsp;&lt;strong&gt;Ctrl&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong&gt;Shift&amp;nbsp;&lt;/strong&gt;keys (&lt;strong&gt;Ctrl&lt;/strong&gt;&amp;nbsp;to start the voice-to-code session, and&amp;nbsp;&lt;strong&gt;Shift&lt;/strong&gt;&amp;nbsp;to switch to string literal input mode), and dictate the text of the string you need. When you&amp;#39;re done, release both keys and CodeRush will insert the string containing your spoken words into the code.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;More Voice Features&lt;/h2&gt;&lt;div&gt;CodeRush contains powerful features for voice interaction in Visual Studio. Other posts documenting voice features in CodeRush:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Setup&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-to-code-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice to Code&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/05/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Comment Dictation&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;String Dictation&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;&lt;br&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/06/03/github-copilot-chat-voice-support-with-coderush-for-visual-studio.aspx" target="_blank"&gt;Copilot Voice Support&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 16 Dec 2024 10:00:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388124</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2024/03/05/comment-dictation-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Commands">Voice Commands</category>
      <title>Comment Dictation in CodeRush for Visual Studio</title>
      <description>&lt;div&gt;CodeRush Voice features include a powerful voice-to-text dictation engine available in C#&amp;nbsp;comments.&lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/RightCtrl.jpg" alt=""&gt;&lt;/p&gt;&lt;p&gt;Comment Dictation features are triggered with the&amp;nbsp;&lt;strong&gt;right Ctrl&lt;/strong&gt;&amp;nbsp;key.&amp;nbsp;&lt;span&gt;Make sure you&amp;#39;ve&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;set up voice features&lt;/a&gt;&lt;span&gt;&amp;nbsp;first.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Also available:&lt;/p&gt;&lt;a href="https://www.youtube.com/watch?v=2fEPsV0WtGs" target="_blank" title="Comment and String Dictation"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VideoCommentAndStringDictation.png" alt=""&gt;&lt;/a&gt;&lt;div&gt;Dictation features also let you automatically include intelligent code references (for example, “see also” markup in an XML doc comment).&lt;/div&gt;&lt;div&gt;To start voice dictation with the caret inside a comment, simply hold down the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and start speaking. Release the Ctrl key when you are done.&lt;/div&gt;&lt;div&gt;To &lt;strong&gt;reference in-scope symbols &lt;/strong&gt;while dictating, hold the &lt;strong&gt;Alt &lt;/strong&gt;key down (while keeping the &lt;strong&gt;Ctrl &lt;/strong&gt;key down). Release the &lt;strong&gt;Alt &lt;/strong&gt;key when you have completed your symbol reference (and release the &lt;strong&gt;Ctrl &lt;/strong&gt;key when you have finished dictating). &lt;/div&gt;&lt;div&gt;You can insert multiple code references inside a single dictation (just hold the &lt;strong&gt;Alt &lt;/strong&gt;key down while referencing code expressions and release to return to normal spoken dictation, repeating as necessary).&lt;/div&gt;&lt;div&gt;For example, let’s say I want to fill in the XML doc comment for the following method:&lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/Add%20two%20numbers%20XML%20Doc%20Comment.png" alt=""&gt;&lt;/p&gt;&lt;div&gt;I can press the&amp;nbsp;&lt;strong&gt;right Ctrl&amp;nbsp;&lt;/strong&gt;key speak the following,&amp;nbsp;&lt;strong&gt;holding down the Alt key&amp;nbsp;&lt;/strong&gt;when saying the bolded/highlighted words:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&amp;quot;This exciting method adds&amp;nbsp;&lt;strong style="background-color:#ffcc99;"&gt;num one&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong style="background-color:#ffcc99;"&gt;num two&lt;/strong&gt;, returning the result.&amp;quot;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/XmlDocCommentAfter.png" alt=""&gt;&lt;p&gt;Notice for the words spoken when the&amp;nbsp;&lt;strong&gt;Alt&amp;nbsp;&lt;/strong&gt;key was down (&amp;quot;num one&amp;quot; and &amp;quot;num two&amp;quot;), CodeRush mapped those spoken words to in-scope&amp;nbsp;symbols, determining that both of&amp;nbsp;these symbols&amp;nbsp;were parameters, and finally inserting&amp;nbsp;the appropriate&amp;nbsp;&lt;strong&gt;&amp;lt;paramref name...&amp;gt;&lt;/strong&gt;&amp;nbsp;tags inside the XML Doc Comment. &lt;/p&gt;&lt;p&gt;You can similarly add &lt;strong&gt;cross&lt;/strong&gt;&lt;strong&gt;-reference tags &lt;/strong&gt;(e.g., &lt;span&gt;&amp;quot;&amp;lt;seealso cref...&amp;gt;&amp;quot;&lt;/span&gt;) for symbols that are not parameters using the exact same steps shown above. &lt;/p&gt;&lt;p&gt;Just hold the &lt;strong&gt;Alt &lt;/strong&gt;key down while saying the name of any in-scope symbol in your code and CodeRush will generate the appropriate tag.&lt;/p&gt;&lt;p&gt;Reminder: the&amp;nbsp;&lt;strong&gt;Ctrl key&amp;nbsp;&lt;/strong&gt;is&amp;nbsp;held down for the entire dictation. The&amp;nbsp;&lt;strong&gt;Alt key&amp;nbsp;&lt;/strong&gt;is only needed when you say words referencing symbols in your code.&lt;/p&gt;&lt;h2&gt;Productivity Suggestions&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Use the &lt;a href="https://docs.devexpress.com/CodeRushForRoslyn/115904/coding-assistance/code-templates" target="_blank"&gt;CodeRush template&lt;/a&gt; &amp;quot;/t&amp;quot; on an empty line to generate a new &lt;strong&gt;// TODO: &lt;/strong&gt;comment in the code, and then immediately follow that with holding the Ctrl key and saying exactly what you want in the TODO.&lt;/li&gt;&lt;li&gt;You can also reference symbols inside regular comments - just hold down the &lt;strong&gt;Alt&lt;/strong&gt; key while saying the name of the symbol you want to reference.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;h2&gt;More Voice Features&lt;/h2&gt;&lt;div&gt;This release contains powerful features that support voice interaction in Visual Studio. Other posts documenting voice features in CodeRush:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Setup&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/08/20/aigen-amp-aifind-in-coderush-for-visual-studio.aspx" target="_blank"&gt;AiGen &amp;amp; AiFind&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-to-code-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice to Code&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;String Dictation&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-in-textfields-in-coderush-for-visual-studio.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;  &lt;/div&gt;

&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;&lt;div data-survey-id="250480b2-a10c-44e8-b657-28afff16d19f" data-survey-auth-required="false"&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 05 Mar 2024 08:05:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388123</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2024/03/05/string-dictation-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Commands">Voice Commands</category>
      <title>String Dictation in CodeRush for Visual Studio</title>
      <description>&lt;div&gt;CodeRush Voice features include a powerful voice-to-text dictation engine available in C#&amp;nbsp;strings. &lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/RightCtrl.jpg" alt=""&gt;&lt;/p&gt;&lt;p&gt;String Dictation features are triggered with the&amp;nbsp;&lt;strong&gt;right Ctrl&lt;/strong&gt;&amp;nbsp;key.&amp;nbsp;&lt;span&gt;Make sure you&amp;#39;ve&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;set up voice features&lt;/a&gt;&lt;span&gt;&amp;nbsp;first.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Also available:&lt;/span&gt;&lt;/p&gt;&lt;a href="https://www.youtube.com/watch?v=2fEPsV0WtGs" target="_blank" title="Comment and String Dictation"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VideoCommentAndStringDictation.png" alt="" style="width:171px;height:93px;"&gt;&lt;/a&gt;&lt;br&gt;&lt;div&gt;String dictation features let you automatically include &lt;strong&gt;intelligent code references &lt;/strong&gt;(for example, a reference to an in-scope symbol or perhaps a simple expression inside an&amp;nbsp;&lt;span&gt;interpolated&amp;nbsp;&lt;/span&gt;string).&lt;/div&gt;&lt;div&gt;To start voice dictation inside a string, hold down the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and start speaking. Release the &lt;strong&gt;Ctrl &lt;/strong&gt;key when you are done. &lt;/div&gt;&lt;div&gt;To reference code while dictating, hold the &lt;strong&gt;Alt &lt;/strong&gt;key down (while keeping the Ctrl key down) as you say the code references or simple expressions. Release the &lt;strong&gt;Alt &lt;/strong&gt;key when you have completed your code reference (wait to release the &lt;strong&gt;Ctrl &lt;/strong&gt;key until you have finished dictating). You can insert multiple code references inside a single dictation (just hold the Alt key down while referencing code expressions and release for normal spoken dictation).&lt;/div&gt;&lt;div&gt;For example, consider the following method:&lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/WritelineBefore.png" alt="" style="width:732px;height:152px;"&gt;&lt;/p&gt;&lt;p&gt;Let&amp;#39;s write the value of &lt;strong&gt;time1 &lt;/strong&gt;to the &lt;strong&gt;Console&lt;/strong&gt;. To do this, press the&amp;nbsp;&lt;strong&gt;right Ctrl&amp;nbsp;&lt;/strong&gt;key and speak the following,&amp;nbsp;&lt;strong&gt;holding down the Alt key&amp;nbsp;&lt;/strong&gt;when saying the bolded/highlighted words:&lt;/p&gt;&lt;div style="margin-left:40px;"&gt;&amp;quot;&lt;strong style="background-color:#ffcc99;"&gt;name of time one&lt;/strong&gt; is &lt;strong style="background-color:#ffcc99;"&gt;time one&lt;/strong&gt;&amp;quot;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/NameOfTimeOneIsTimeOne.png" alt="" style="width:713px;height:156px;"&gt;&lt;p&gt;Notice for the words spoken when the &lt;strong&gt;Alt &lt;/strong&gt;key was down, CodeRush mapped those spoken words to the &lt;strong&gt;time1&lt;/strong&gt; parameter, and inserted the appropriate &lt;strong&gt;nameof&lt;/strong&gt;&amp;nbsp;call. &lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Ctrl key &lt;/strong&gt;is held down for the entire dictation. The &lt;strong&gt;Alt key &lt;/strong&gt;is held at the start because we&amp;#39;re starting with a code reference, but the &lt;strong&gt;Alt&lt;/strong&gt; key is only needed when you say words referencing&amp;nbsp;code outside the string.&lt;/p&gt;&lt;p&gt;You can also reference simple expressions in strings. For example, consider the following method:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/AddTwoNumbers.png" alt="" style="width:606px;height:141px;"&gt;&lt;/p&gt;&lt;p&gt;Here, let&amp;#39;s show that the total of the two numbers equals their sum. &lt;span&gt;&amp;nbsp;Press the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;right Ctrl&amp;nbsp;&lt;/strong&gt;&lt;span&gt;key and speak the following,&amp;nbsp;&lt;/span&gt;holding down the &lt;strong&gt;Alt key&amp;nbsp;&lt;/strong&gt;when saying the bolded/highlighted words:&lt;/p&gt;&lt;div&gt;&amp;quot;&lt;strong style="background-color:#ffcc99;"&gt;num one&lt;/strong&gt;&amp;nbsp;plus &lt;strong&gt;&lt;span style="background-color:#ffcc99;"&gt;num two&lt;/span&gt; &lt;/strong&gt;equals &lt;span style="background-color:#ffcc99;"&gt;&lt;strong&gt;num one&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;plus&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="background-color:#ffcc99;"&gt;num two&lt;/span&gt;&lt;/strong&gt;&amp;quot;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/AddTwoNumberAfter.png" alt="" style="width:719px;height:141px;"&gt;&lt;div&gt;&lt;h2&gt;More Voice Features&lt;/h2&gt;&lt;div&gt;&lt;span&gt;This release contains powerful features that support voice interaction in Visual Studio. Other posts documenting voice features in CodeRush:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Setup&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/08/20/aigen-amp-aifind-in-coderush-for-visual-studio.aspx" target="_blank"&gt;AiGen &amp;amp; AiFind&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-to-code-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice to Code&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Comment Dictation&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-in-textfields-in-coderush-for-visual-studio.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;  &lt;/div&gt;&lt;br&gt;&lt;/div&gt;

&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;&lt;div data-survey-id="250480b2-a10c-44e8-b657-28afff16d19f" data-survey-auth-required="false"&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 05 Mar 2024 08:04:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388121</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2024/03/05/voice-to-code-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Commands">Voice Commands</category>
      <title>Voice to Code in CodeRush for Visual Studio</title>
      <description>&lt;div&gt;One of the more exciting features in this release is Voice to Code, which uses Visual Studio&amp;#39;s IntelliSense to intelligently convert spoken words to code.&lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/RightCtrl.jpg" alt="" style="width:300px;height:224px;"&gt;&lt;/p&gt;&lt;p&gt;Voice to Code features are triggered with the &lt;strong&gt;right Ctrl&lt;/strong&gt; key.&amp;nbsp;&lt;span&gt;Make sure you&amp;#39;ve&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;set up voice features&lt;/a&gt;&lt;span&gt;&amp;nbsp;first.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;To create a new simple expression inside source code, hold down the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and say the expression. Release the &lt;strong&gt;right&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Ctrl &lt;/strong&gt;key when you have finished saying the expression.&lt;/div&gt;&lt;p&gt;&lt;span&gt;For example, for qualified expressions like “a.b.c()”, you can omit the dots and parens and simply say “a b c”.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Also available:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=m3sH_r17M6s" target="_blank" title="Voice to Code"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VideoVoiceToCode.png" alt="" style="width:166px;height:98px;"&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Simple Expressions&lt;/h2&gt;&lt;div&gt;In our initial release, Voice to Code supports the following &lt;strong&gt;simple expressions&lt;/strong&gt;:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Qualified references&lt;/strong&gt; to any symbol in scope (e.g., &amp;quot;myCustomer.DataPoints.Length&amp;quot;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;nameof&lt;/strong&gt;()&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;and &lt;strong&gt;typeof&lt;/strong&gt;()&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;calls.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Method calls &lt;/strong&gt;(e.g., &amp;quot;myCase.ToString()&amp;quot;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Linq expressions &lt;/strong&gt;using method syntax (e.g, &amp;quot;myPoints.Select(x =&amp;gt; x.Y).Max()&amp;quot;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Binary expression&lt;/strong&gt;&lt;strong&gt;s&lt;/strong&gt; (e.g, &amp;quot;myList.Count + myOtherList.Count&amp;quot; or &amp;quot;dataPoint.Time &amp;lt; DateTime.UtcNow) )&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Numbers &lt;/strong&gt;(e.g, &amp;quot;3.14159&amp;quot;, &amp;quot;2024&amp;quot;, &amp;quot;100&amp;quot;, or &amp;quot;-9876543210.0123456789&amp;quot;).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;You can also&amp;nbsp;&lt;/span&gt;&lt;strong&gt;reference symbols&amp;nbsp;&lt;/strong&gt;&lt;span&gt;inside&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;comments&lt;/a&gt;&lt;span&gt;&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;strings&lt;/a&gt;&lt;span&gt;, and add simple expressions to interpolated strings.&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;/ul&gt;&lt;h2&gt;Groundbreaking Next Generation Voice to Code Technology&lt;/h2&gt;&lt;div&gt;The Voice to Code engine works with Visual Studio&amp;#39;s IntelliSense to evaluate a &lt;strong&gt;multiverse of phonetic interpretations&lt;/strong&gt;, always trying to match the best code to the spoken phrase.&lt;/div&gt;&lt;div&gt;As an example, consider the following simple expression that might appear inside an NUnit test case:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;code class="language-csharp"&gt;Is.EqualTo(3)&lt;/code&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;To get this expression, hold down the &lt;strong&gt;right Ctrl &lt;/strong&gt;key inside Visual Studio (with the caret in a place where this expression could go) and simply say &amp;quot;&lt;strong&gt;i&lt;/strong&gt;&lt;strong&gt;s equal to three&lt;/strong&gt;”.&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/TestAddThreeNumbers_Before.png" alt="" style="width:832px;height:167px;"&gt;&lt;div&gt;&lt;strong&gt;Release &lt;/strong&gt;the &lt;strong&gt;right Ctrl &lt;/strong&gt;key when you are done speaking. If the caret is inside an &lt;strong&gt;NUnit &lt;/strong&gt;test case, the engine will find the &amp;quot;&lt;strong&gt;Is&lt;/strong&gt;&amp;quot; class, then find its &amp;quot;&lt;strong&gt;EqualTo&lt;/strong&gt;&amp;quot; method, and see that EqualTo() accepts a parameter (so it passes the &amp;quot;&lt;strong&gt;3&lt;/strong&gt;&amp;quot; in as an argument because that makes the most sense in this context).&lt;/div&gt;&lt;div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/TestAddThreeNumbers_After.png" alt="" style="width:768px;height:165px;"&gt;&lt;/div&gt;&lt;div&gt;Along the path to finding this solution, the engine evaluates other in-scope alternatives, possibly including in-scope variations that end in &amp;quot;23&amp;quot; (since the words &amp;quot;to three&amp;quot; sound exactly like &amp;quot;2 3&amp;quot;).&lt;/div&gt;&lt;div&gt;As a result, you rarely need to tell the engine where the dot qualifier goes - it simply solves that problem using IntelliSense. For example, if I want the expression &amp;quot;A().B().C().D()&amp;quot;, I can say &amp;quot;A B C D&amp;quot;. Of course, you can also explicitly point out where to place each dot delimiter by saying &amp;quot;dot&amp;quot; (which might be useful for resolving phonetic collisions).&lt;/div&gt;&lt;div&gt;The Voice to Code engine knows if it is inserting a method, property, parameter, etc, and so it formats the code appropriately. That means method calls will always include parens, and Linq expressions will automatically include the “x =&amp;gt; x” lambda declaration. For example, in the following code…&lt;/div&gt;&lt;div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/GetHighestPoint.png" alt="" style="width:487px;height:109px;"&gt;&lt;/div&gt;&lt;div&gt;if you want to return the &lt;strong&gt;highest y-value &lt;/strong&gt;in a &lt;strong&gt;list of Points &lt;/strong&gt;called &amp;quot;&lt;strong&gt;myPoints&lt;/strong&gt;&amp;quot;, hold down the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and simply say:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&amp;quot;&lt;strong&gt;my points select y max&lt;/strong&gt;&amp;quot;&lt;/div&gt;&lt;div&gt;and you’ll get the following Linq expression:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;code class="language-csharp"&gt;myPoints.Select(x =&amp;gt; x.Y).Max()&lt;/code&gt;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/GetHighestPoint-CodeComplete.png" alt="" style="width:507px;height:139px;"&gt;&lt;p&gt;Let&amp;#39;s take a &lt;span&gt;closer&lt;/span&gt; look. In the code we want to create, &lt;strong&gt;we only said&amp;nbsp;&lt;/strong&gt;the &lt;strong&gt;important words&lt;/strong&gt; (highlighted in yellow, below):&lt;/p&gt;&lt;div style="margin-left:40px;"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/myPointsImportantWords.png" alt="" style="width:272px;height:22.5942px;"&gt;&lt;/div&gt;&lt;div&gt;Let’s consider another example. The following in-progress method wants to calculate the &lt;strong&gt;age in days &lt;/strong&gt;that have passed since the specified &lt;strong&gt;DateTime&lt;/strong&gt; parameter (named “&lt;strong&gt;time&lt;/strong&gt;”).&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/GetAgeInDaysBefore.png" alt="" style="width:463px;height:116px;"&gt;&lt;div&gt;With the caret where we want our expression, hold down the &lt;strong&gt;right Ctrl&lt;/strong&gt; key and say:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;“&lt;strong&gt;date time UTC now minus time, total days&lt;/strong&gt;”.&lt;/div&gt;&lt;div&gt;(release the &lt;strong&gt;Ctrl &lt;/strong&gt;key when you are done)&lt;/div&gt;&lt;div&gt;The Voice to Code engine generates this:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;code class="language-csharp"&gt;(DateTime.UtcNow - time).TotalDays&lt;/code&gt;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/GetAgeInDaysAfter.png" alt="" style="width:502px;height:105px;"&gt;&lt;div&gt;Note that the engine realizes the &lt;strong&gt;subtracted difference&lt;/strong&gt; between our two spoken &lt;strong&gt;DateTime &lt;/strong&gt;instances is a &lt;strong&gt;TimeSpan &lt;/strong&gt;(due to DateTime’s declared minus operator overload), and it knows the &lt;strong&gt;TotalDays &lt;/strong&gt;property is available on &lt;strong&gt;TimeSpan &lt;/strong&gt;instances (but &lt;strong&gt;not &lt;/strong&gt;on the DateTime time instance). And so the engine concludes TotalDays must apply to the binary expression, and &lt;strong&gt;adds enclosing parentheses&lt;/strong&gt; accordingly.&lt;/div&gt;&lt;div&gt;Understanding binary expressions, method calls, and Linq expressions means you can omit the punctuation and pretty much say only the essential identifiers, operators, and numbers. CodeRush uses your spoken words along with IntelliSense to find the best fit.&lt;/div&gt;&lt;h2&gt;More on Numbers&lt;/h2&gt;&lt;p&gt;Numbers can be spoken a single digit at a time (e.g., &amp;quot;one two three&amp;quot; to get 123), in pairs (like “twenty twenty-four” to get “2024”), or using numeric words and multipliers (e.g., &amp;quot;one hundred and twenty three&amp;quot; to get 123, or&amp;nbsp;“negative three thousand two hundred and fourteen” to get “-3214”). Use the word “point” to specify a decimal separator (e.g., &amp;quot;three point one four&amp;quot; to get 3.14).&lt;/p&gt;&lt;h2&gt;Enums&lt;/h2&gt;&lt;div&gt;The Voice to Code engine understands many places where enum elements are expected (e.g., parameters, assignments, equality comparisons, etc.), and as a result it&amp;#39;s unlikely you&amp;#39;ll ever need to explicitly say the Enum type name. For example, consider the following code:&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/EnumEqualityCheck_Before.png" alt="" style="width:558px;height:364px;"&gt;&lt;div&gt;Now, with the caret where you want your expression, hold down the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and say&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&amp;quot;&lt;strong&gt;flavor equals chocolate&lt;/strong&gt;&amp;quot;.&lt;/div&gt;&lt;div&gt;CodeRush will generate the following equality comparison expression:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;code class="language-csharp"&gt;flavor == IceCreamFlavors.Chocolate&lt;/code&gt;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/EnumEqualityCheck_After.png" alt="" style="width:561px;height:364px;"&gt;&lt;div&gt;&lt;span&gt;Notice it correctly gets the name of the enum type (&amp;quot;&lt;strong&gt;IceCreamFlavors&lt;/strong&gt;&amp;quot;) without it ever having to be said.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Again, highlighting the important parts of that expression that need to be said:&lt;/div&gt;&lt;p style="margin-left:40px;"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/flovor%20important%20words.png" alt="" style="width:293px;height:20px;"&gt;&lt;br&gt;&lt;/p&gt;&lt;div style="margin-left:40px;"&gt;&lt;/div&gt;&lt;p&gt;Enum type names are generally never needed in the spoken phrase.&lt;/p&gt;&lt;div&gt;&lt;span style="color:#404040;font-family:&amp;#39;Open Sans Condensed&amp;#39;, HelveticaNeue-CondensedBold, Helvetica, &amp;#39;Arial Narrow&amp;#39;, Calibri, Arial, &amp;#39;Lucida Grande&amp;#39;, sans-serif;font-size:30px;"&gt;Attributes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;To add an attribute, &lt;strong&gt;first enter the open square bracket&lt;/strong&gt; into the code, and then press the &lt;strong&gt;right Ctrl&lt;/strong&gt; key while saying the name of the attribute (and any arguments you want to pass).&lt;/div&gt;&lt;div&gt;For example, consider the following code...&lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/DebuggerBrowsableAttribute_Before.png" alt="" style="width:469px;height:254px;"&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;if we want our&amp;nbsp;&lt;/span&gt;&lt;strong&gt;ApiKey&amp;nbsp;&lt;/strong&gt;&lt;span&gt;property to&amp;nbsp;&lt;/span&gt;&lt;strong&gt;never&lt;/strong&gt;&lt;span&gt;&amp;nbsp;appear in Visual Studio&amp;#39;s debugger variable windows, with the caret inside the square brakets,&amp;nbsp;&lt;/span&gt;press the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and say:&lt;/p&gt;&lt;div style="margin-left:40px;"&gt;&amp;quot;&lt;strong&gt;debugger browsable never&lt;/strong&gt;&amp;quot;&lt;/div&gt;&lt;div&gt;and you&amp;#39;ll get this attribute:&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;code class="language-csharp"&gt;[DebuggerBrowsable(DebuggerBrowsableState.Never)]&lt;/code&gt;&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/DebuggerBrowsableAttribute_After.png" alt="" style="width:605px;height:256px;"&gt;&lt;div&gt;&lt;h2&gt;More Voice Features&lt;/h2&gt;&lt;div&gt;&lt;span&gt;This release contains powerful features that support voice interaction in Visual Studio. Other posts documenting voice features in CodeRush:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Setup&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/08/20/aigen-amp-aifind-in-coderush-for-visual-studio.aspx" target="_blank"&gt;AiGen &amp;amp; AiFind&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-to-code-in-coderush-for-visual-studio.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;String Dictation&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Comment Dictation&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-in-textfields-in-coderush-for-visual-studio.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Limitations&lt;/h2&gt;&lt;div&gt;The engine works on simple expressions. This is a 1.0 release, and while we think there&amp;#39;s groundbreaking power in what&amp;#39;s shipping, there are some limitations. For starters, the technology is currently only available in C#. And the Voice to Code engine cannot recognize types that are not directly visible from the caret position -- using statements need to be in place to reference types in those namespaces.&lt;/div&gt;&lt;div&gt;Additionally, the following structural code blocks are not supported (we recommend using CodeRush templates instead for all of these):&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Type and member declarations.&lt;/li&gt;&lt;li&gt;Flow control elements (like for loops, try/finally, if/else, etc.).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Here&amp;#39;s some of what the Voice to Code technology does not yet support:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;boolean literals (false, true)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;null &lt;/strong&gt;literal&lt;/li&gt;&lt;li&gt;&lt;strong&gt;assignment &lt;/strong&gt;statements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;!=&lt;/strong&gt; comparisons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;string literals&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;is &lt;/strong&gt;or &lt;strong&gt;as&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;scientific notation &lt;/strong&gt;numeric literals&lt;/li&gt;&lt;li&gt;multiple arguments to a method call&lt;/li&gt;&lt;li&gt;&lt;strong&gt;named parameters&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;instance creation&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Linq query syntax&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;semicolons &lt;/strong&gt;placed after statements&lt;/li&gt;&lt;li&gt;property and array &lt;strong&gt;indexers&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Boolean and binary operators&lt;/strong&gt; like &amp;amp;&amp;amp;, ||, etc.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;bit shifting &lt;/strong&gt;&lt;strong&gt;operators &lt;/strong&gt;like &amp;lt;&amp;lt;, &amp;gt;&amp;gt;, etc.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;We expect many of these limitations to be solved in subsequent releases.&lt;/div&gt;

&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;&lt;div data-survey-id="250480b2-a10c-44e8-b657-28afff16d19f" data-survey-auth-required="false"&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 05 Mar 2024 08:02:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388103</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2024/03/05/voice-commands-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Commands">Voice Commands</category>
      <title>Voice Commands in CodeRush for Visual Studio</title>
      <description>&lt;div&gt;Voice Commands let you control and access Visual Studio by voice. Voice Commands are fully customizable, are context-aware, and support &lt;strong&gt;inferred intent &lt;/strong&gt;(e.g. a “&lt;strong&gt;Build Solution&lt;/strong&gt;” voice command can be triggered with the phrase “&lt;strong&gt;please compile all my projects&lt;/strong&gt;”.&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/LeftCtrl.jpg" alt="" style="width:300px;height:232px;"&gt;&lt;div&gt;To invoke a Voice Command, &lt;strong&gt;hold down&lt;/strong&gt; the &lt;strong&gt;left Ctrl &lt;/strong&gt;key and say the command. &lt;span&gt;Make sure you&amp;#39;ve&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;set up voice features&lt;/a&gt;&lt;span&gt;&amp;nbsp;first.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Release the &lt;strong&gt;Ctrl &lt;/strong&gt;key when you have finished.&lt;/div&gt;&lt;p&gt;Also available:&lt;/p&gt;&lt;a href="https://www.youtube.com/watch?v=W8ttSY8iE_Q" target="_blank" title="Voice Commands"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VideoVoiceCommands.png" alt="" style="width:155px;height:90px;"&gt;&lt;/a&gt;&lt;h2&gt;Opening Files&lt;/h2&gt;&lt;div&gt;The most important Voice Command for developers working in large solutions is the &lt;strong&gt;Open &lt;em&gt;fileName&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;command. This command allows you to open any file in your solution. Just hold down the &lt;strong&gt;left Ctrl &lt;/strong&gt;key and say “&lt;strong&gt;Open&lt;/strong&gt;” followed by only the &lt;strong&gt;file name&lt;/strong&gt; (the file extension is unnecessary if the file uses the default extension for the project). This feature is a &lt;strong&gt;huge productivity boost&lt;/strong&gt; when working in very large solutions (e.g., more than 10,000 files). It is the fastest/easiest way to open files (much faster than using a mouse or keyboard). It even works if you only remember a portion of the &lt;strong&gt;camel case file name parts &lt;/strong&gt;(or if you say the parts slightly out of order).&lt;/div&gt;&lt;div&gt;For example, if my solution contains a file named &lt;strong&gt;StreamDeckStorageServices.cs,&lt;/strong&gt; I can open that file with any of these spoken phrases:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;open stream decks storage&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;open streaming deck service&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;open deck storage service&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Showing Tool Windows&lt;/h2&gt;&lt;div&gt;The second most important Voice Command to learn is the &lt;strong&gt;Show Me &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;toolWindowName &lt;/strong&gt;&lt;/em&gt;command. Just hold down the &lt;strong&gt;left Ctrl &lt;/strong&gt;key and say “&lt;strong&gt;Show me&lt;/strong&gt;” followed by the name/title&amp;nbsp;of the Visual Studio tool window (Microsoft ships about 100 different ones with Visual Studio). This will open the selected tool window in Visual Studio. Here are some examples:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;how me Call Stack&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;strong&gt;how me Locals&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;how me Watch 3&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;show me Parallel Watch 2&lt;/strong&gt;&amp;quot;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;how me Immediate&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;how me Solution Explorer&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;how me Properties&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;how me Threads&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;how me Modules&lt;/strong&gt;&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Navigating Types and Members&lt;/h2&gt;&lt;p&gt;To jump to any member in the active class, say &amp;quot;&lt;strong&gt;member&lt;/strong&gt;&amp;quot; followed by the name of the member.&lt;/p&gt;&lt;p&gt;&lt;span&gt;To jump to any type in the solution, say &amp;quot;&lt;strong&gt;type&lt;/strong&gt;&amp;quot; followed by the name of the type.&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Bookmarks&lt;/h2&gt;&lt;p&gt;You can drop a permanent named bookmark anywhere in the code and return to it laters by voice. To drop a bookmark,&amp;nbsp;&lt;span&gt;hold down the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;left Ctrl&amp;nbsp;&lt;/strong&gt;&lt;span&gt;key and say “&lt;/span&gt;&lt;strong&gt;Bookmark&lt;/strong&gt;&lt;span&gt;” followed by the name&amp;nbsp;of the bookmark. For example:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left:40px;"&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;bookmark &lt;span&gt;storage&lt;/span&gt;&lt;/strong&gt;&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Later, to return to that bookmark, &lt;span&gt;hold down the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;left Ctrl&amp;nbsp;&lt;/strong&gt;&lt;span&gt;key and say “&lt;/span&gt;&lt;strong&gt;Go to&lt;/strong&gt;&lt;span&gt;” followed by the same name&amp;nbsp;of the bookmark. For example:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left:40px;"&gt;&lt;span&gt;&amp;quot;&lt;strong&gt;go to storage&lt;/strong&gt;&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Other Voice Commands&lt;/h2&gt;&lt;div&gt;Voice Commands make accessing files and tool windows easy. They are also great for commands you may execute irregularly for which you don’t already have memorized shortcuts. Some examples of prebuilt Voice Commands shipping in CodeRush:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;copy file path&lt;/strong&gt;&amp;quot; - copies the full path of the active file to the clipboard.&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;open containing folder&lt;/strong&gt;&amp;quot; (or &amp;quot;&lt;strong&gt;file location&lt;/strong&gt;&amp;quot;) - opens the folder containing the active document in a new instance of&amp;nbsp;Windows Explorer.&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;new folder&lt;/strong&gt;&amp;quot; - adds a new folder to the project (in the same folder containing the active document).&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;add class&lt;/strong&gt;&amp;quot; - adds a new item to the project&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;add existing item&lt;/strong&gt;&amp;quot; - adds an existing&amp;nbsp;item to the project&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;project properties&lt;/strong&gt;&amp;quot; - opens the properties window for the active project&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;filter solution explorer&lt;/strong&gt;&amp;quot; - activates the Solution Explorer&amp;#39;s search filter TextBox (you can then hold down the &lt;strong&gt;right Ctrl&lt;/strong&gt; key a say the filter you want to use)&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;repeat last test run&lt;/strong&gt;&amp;quot; - repeats the last test run in the last mode it was run under (e.g., debug or normal)&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;run this&lt;/strong&gt;&amp;quot;&amp;nbsp;- runs the active test case (or runs all the test cases in the active test class)&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;debug this&lt;/strong&gt;&amp;quot;&lt;span&gt;&amp;nbsp;- debugs the active test case&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;implementations&lt;/strong&gt;&amp;quot; &lt;span&gt;-&amp;nbsp;&lt;/span&gt;navigates to implementations of the active interface member&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;full screen&lt;/strong&gt;&amp;quot; &lt;span&gt;-&amp;nbsp;&lt;/span&gt;toggles full screen mode&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;b&gt;NuGet packages&lt;/b&gt;&amp;quot;&amp;nbsp;-&amp;nbsp;brings up the NuGet package manager for the solution&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;show me CodeRush test runner&lt;/strong&gt;&amp;quot; - brings up the&amp;nbsp;&lt;span&gt;CodeRush Test Runner tool window&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;DevExpress&lt;/strong&gt;&amp;quot; - opens up the &lt;strong&gt;devexpress.com&lt;/strong&gt; web site.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Just hold down the &lt;strong&gt;left Ctrl &lt;/strong&gt;key and say any of the commands above (many of these commands also support &lt;strong&gt;inferred intent&lt;/strong&gt;, so you don’t need to be precise when you say them).&lt;/div&gt;&lt;h2&gt;Custom Voice Commands&lt;/h2&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;You can create your own voice commands on the CodeRush &lt;strong&gt;Voice Commands&lt;/strong&gt; options page.&amp;nbsp;&lt;span style="color:#505050;"&gt;You can also edit/delete/enable/disable existing voice commands on this page.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VoiceGeneralOptionsPage.png" alt="" style="width:789px;height:419px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;You can get to this page quickly from the &lt;strong&gt;CodeRush &lt;/strong&gt;| &lt;strong&gt;Voice Commands...&amp;nbsp;&lt;/strong&gt;menu item (this options page is in the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;IDE&lt;/strong&gt;/&lt;strong&gt;Cognitive &lt;/strong&gt;options folder).&lt;/p&gt;&lt;h3&gt;Creating a New Folder for Your Voice Commands&lt;/h3&gt;&lt;div&gt;Take a moment to consider what folder will contain your new command. While you can select one of the existing folders, for reasons based on versioning, updating, and sharing we recommend&amp;nbsp;creating&amp;nbsp;a &lt;strong&gt;new folder &lt;/strong&gt;to hold your commands. To create a new folder, click the &lt;strong&gt;New Folder&lt;/strong&gt; icon at the top:&lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/CreateNewVoiceCommandFolder.png" alt="" style="width:253px;height:322px;"&gt;&lt;/p&gt;&lt;p&gt;Enter a folder name, and check the &amp;quot;&lt;strong&gt;Make this a top level folder&lt;/strong&gt;&amp;quot; checkbox.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/NewFolderName.png" alt="" style="width:324px;height:224px;"&gt;&lt;/p&gt;&lt;p&gt;Click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;&lt;h3&gt;Adding a New&amp;nbsp;&lt;span&gt;Voice Command&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;Click the &lt;strong&gt;New Voice Command &lt;/strong&gt;button at the top left.&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/ClickNewVoiceCommandButton.png" alt="" style="width:260px;height:367px;"&gt;&lt;div&gt;An empty Voice Command is added to the active folder. The voice command contains the following fields/options:&lt;/div&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/NewVoiceCommandFields.png" alt="" style="width:531px;height:458px;"&gt;&lt;/p&gt;&lt;p&gt;First, decide the words you want to say to execute the command. For this example, we&amp;#39;ll create a new Voice Command that applies code changes during debugging (invoking the Visual Studio command &amp;quot;Debug.ApplyCodeChanges&amp;quot;). In this case we might want to trigger this command with two different phrases:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;apply code changes&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;strong&gt;hot reload&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For the words to say, we can use a pipe symbol to separate equivalent alternatives. So in this field we could enter &amp;quot;&lt;strong&gt;apply code changes | hot reload&amp;quot;&lt;/strong&gt;​.&lt;/p&gt;&lt;p&gt;If you have supplied an OpenAI API key, you may want to check the &amp;quot;&lt;strong&gt;Allow Semantic Equivalents&lt;/strong&gt;&amp;quot; checkbox. In this example, it would allow you to invoke the command by saying &amp;quot;&lt;strong&gt;let&amp;#39;s apply these awesome code changes&lt;/strong&gt;&amp;quot; or &amp;quot;&lt;strong&gt;it&amp;#39;s time to reload at super high temperature&lt;/strong&gt;&amp;quot;. This means you won&amp;#39;t have to recall the specific words of the command - just the essence of what you want to do.&amp;nbsp;&lt;span&gt;Checking this checkbox will send any spoken phrase that is not perfectly matched to OpenAI to get the inferred match.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Choose the command to bind to this new Voice Command. The combobox on this page lists all CodeRush commands. If you want to bind to a Visual Studio command (like “Edit.Copy”), simply enter it here. You can find a complete list of Visual Studio commands in the Visual Studio Options dialog on the &lt;strong&gt;Keyboard &amp;amp; Shortcuts&lt;/strong&gt; page. For our example, let&amp;#39;s enter&amp;nbsp;&lt;span&gt;&lt;strong&gt;Debug.ApplyCodeChanges&lt;/strong&gt;.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;You can leave the &lt;strong&gt;Parameters &lt;/strong&gt;textbox empty (some CodeRush commands can take additional parameters).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;The last option for our Voice Command is &lt;a href="https://docs.devexpress.com/CodeRushForRoslyn/117845/coding-assistance/custom-template-creation/context-providers" target="_blank"&gt;Context&lt;/a&gt;, which lets you determine when this voice command is available. Specifying context is generally a good idea because it can improve performance, increase accuracy, and shorten&amp;nbsp;the prompt sent to OpenAI when Allow Semantic Equivalents is turned on. For this example command, it only makes sense to invoke it when actively debugging. To add a context, click the &amp;quot;...&amp;quot; button to the right of the Context TextBox. The &lt;strong&gt;Select Context Provider&lt;/strong&gt; dialog will appear.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;In the filter dialog at the top, enter &amp;quot;Debug&amp;quot; and click the System\DebugMode context. This context is true when you are debugging in Visual Studio:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/SelectContextProvider.png" alt="" style="width:337px;height:269px;"&gt;&lt;/p&gt;&lt;div&gt;The filled-out fields for this example command should now look like this:&lt;/div&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/FilledOutNewVoiceCommandFields.png" alt="" style="width:479px;height:399px;"&gt;&lt;div&gt;If you&amp;#39;ve been following along with this example so far, click &lt;strong&gt;OK &lt;/strong&gt;and try it out! Start a debugging session, enter a breakpoint, change some code, hold down the &lt;strong&gt;left Ctrl&lt;/strong&gt; key and state your command! Look to the status bar for confirmation that code changes have been applied. Congratulations! You have just created your first Voice Command!&lt;/div&gt;&lt;div&gt;&lt;span style="color:#404040;font-family:&amp;#39;Open Sans Condensed&amp;#39;, HelveticaNeue-CondensedBold, Helvetica, &amp;#39;Arial Narrow&amp;#39;, Calibri, Arial, &amp;#39;Lucida Grande&amp;#39;, sans-serif;font-size:30px;"&gt;More Voice Features&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;This release contains powerful features that support voice interaction in Visual Studio. Other posts documenting voice features in CodeRush:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-setup-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Setup&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/08/20/aigen-amp-aifind-in-coderush-for-visual-studio.aspx" target="_blank"&gt;AiGen &amp;amp; AiFind&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-to-code-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice to Code&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;String Dictation&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Comment Dictation&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;

&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;&lt;div data-survey-id="250480b2-a10c-44e8-b657-28afff16d19f" data-survey-auth-required="false"&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 05 Mar 2024 08:01:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388120</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2024/03/05/voice-setup-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/Azure">Azure</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/IDE">IDE</category>
      <category domain="https://community.devexpress.com/Tags/productivity">productivity</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/visual+studio+2022">visual studio 2022</category>
      <category domain="https://community.devexpress.com/Tags/Voice+Commands">Voice Commands</category>
      <title>Voice Setup in CodeRush for Visual Studio</title>
      <description>&lt;div&gt;This blog post provides an overview of the new Voice Features in CodeRush for Visual Studio and shows you how to set up and enable the features.&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Voice Features&amp;nbsp;&lt;/strong&gt;&lt;span&gt;are invoked by &lt;strong&gt;holding down&lt;/strong&gt; one of the two&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Ctrl&amp;nbsp;&lt;/strong&gt;&lt;span&gt;keys &lt;strong&gt;while speaking&lt;/strong&gt;.&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/LeftAndRightCtrlKeySummary.jpg" alt="" style="width:658px;height:287px;"&gt;&lt;/p&gt;&lt;p&gt;Also available:&lt;/p&gt;&lt;a href="https://www.youtube.com/watch?v=vfxFonsvgsk" target="_blank" title="Voice Setup"&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VideoVoiceSetup.png" alt="" style="width:160px;height:97px;"&gt;&lt;/a&gt;&lt;p&gt;Setup involves three steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Entering your API keys&lt;/li&gt;&lt;li&gt;Enabling Voice Features&lt;/li&gt;&lt;li&gt;Setting Microphone Level&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;h2&gt;API Keys&lt;/h2&gt;&lt;p&gt;CodeRush Voice Features requires an Azure Speech Services API key. At the time of this post, you can create a &lt;a href="https://portal.azure.com/#view/Microsoft_Azure_Billing/FreeServicesBlade" target="_blank"&gt;free Azure account&lt;/a&gt; that includes 5 audio hours of speech to text processing services every month.&amp;nbsp;&lt;/p&gt;&lt;p&gt;To set up a new&amp;nbsp;OpenAI account (and get your OpenAI API key), &lt;a href="https://platform.openai.com/docs/quickstart/account-setup" target="_blank"&gt;click here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Once you have set up your Azure account, create a new Speech Service if necessary, and copy one of the keys shown in the &lt;strong&gt;Keys and endpoint&lt;/strong&gt; section:&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/Azure%20Keys.png" alt="" style="width:723px;height:384px;"&gt;&lt;/div&gt;&lt;p&gt;Also note the Location/Region setting on this page.&lt;/p&gt;&lt;p&gt;Inside the CodeRush options dialog, navigate to the &lt;strong&gt;IDE&lt;/strong&gt;\&lt;strong&gt;Cognitive&lt;/strong&gt;\&lt;strong&gt;API Keys&lt;/strong&gt; options page, and enter your Azure Speech Service API key (copied from the previous step) and the &lt;span&gt;Azure&amp;nbsp;&lt;/span&gt;Location/Region (which you can also copy from Azure):&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/Cognitive%20API%20Keys%20Page-.png" alt="" style="width:1495px;height:400px;"&gt;&lt;/p&gt;&lt;p&gt;CodeRush stores these API Keys as environment variables on your machine.&lt;/p&gt;&lt;p&gt;If you want to use the &amp;quot;&lt;strong&gt;Allow semantic equivalents&lt;/strong&gt;&amp;quot; feature in &lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;, you&amp;#39;ll need to also add an Open AI API key.&lt;/p&gt;&lt;p&gt;Once your API keys have been entered, click on the &lt;strong&gt;IDE&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;Cognitive&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;General&lt;/strong&gt; options page.&lt;/p&gt;&lt;h2&gt;Enabling Voice Features&lt;/h2&gt;&lt;p&gt;O&lt;span&gt;n the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;Cognitive&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;span&gt;&amp;nbsp;options page, check the&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;strong&gt;Enable Voice Features&lt;/strong&gt;&amp;quot; checkbox. Optionally you can also enable the &amp;quot;&lt;strong&gt;Enable Cognitive Features&lt;/strong&gt;&amp;quot; checkbox to turn on&amp;nbsp;&lt;span&gt;the &amp;quot;&lt;/span&gt;&lt;strong&gt;Allow semantic equivalents&lt;/strong&gt;&lt;span&gt;&amp;quot; feature in&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;.&amp;nbsp;This option will also impact future cognitive features in CodeRush.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VoiceGeneralOptions.png" alt="" style="width:938px;height:573px;"&gt;&lt;/p&gt;&lt;h2&gt;Setting Microphone Level&lt;/h2&gt;&lt;p&gt;Below the Enable Voice Features checkbox, there is a slider allowing you to set the &lt;strong&gt;volume threshold &lt;/strong&gt;that must be exceeded for CodeRush to start listening (when the &lt;strong&gt;Ctrl &lt;/strong&gt;key is down). &lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VoiceGeneralOptionsCloseup.png" alt="" style="width:410px;height:294px;"&gt;&lt;p&gt;The easiest way to set this for your location is to remain quiet for a moment, and then click the &lt;strong&gt;Auto Set&lt;/strong&gt; button.&amp;nbsp;This will measure the ambient volume in the room and set the threshold slightly above that level. If you regularly listen to music on speakers or work in a location with more ambient noise, make sure that your location&amp;#39;s noise source is available at its normal levels when you click &lt;strong&gt;Auto Set&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;After setting the threshold, speak normally into your microphone. The volume meter should turn light blue when you are speaking (your volume exceeds the threshold),&amp;nbsp;and be light orange when you are quiet (when the volume falls below the threshold).&lt;/p&gt;&lt;h2&gt;Quick Test&lt;/h2&gt;&lt;p&gt;Try these two tests after setting the API keys and enabling Voice Features:&lt;/p&gt;&lt;h3&gt;Comment Dictation&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Open or create a new &lt;strong&gt;C# file&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Go to an empty line in the file and&amp;nbsp;enter &amp;quot;&lt;strong&gt;//&lt;/strong&gt;&amp;quot; to start a comment.&lt;/li&gt;&lt;li&gt;Hold down the &lt;strong&gt;right Ctrl &lt;/strong&gt;key and say &amp;quot;&lt;strong&gt;Hello Visual Studio.&lt;/strong&gt;&amp;quot;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Your spoken words should appear&amp;nbsp;inside the comment:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/HelloVisualStudio.png" alt="" style="width:274px;height:63px;"&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Voice Commands&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Open a Visual Studio solution.&lt;/li&gt;&lt;li&gt;Open any file from that solution holding &lt;span&gt;down the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;left Ctrl &lt;/strong&gt;key&amp;nbsp;&lt;span&gt;and&amp;nbsp;&lt;/span&gt;saying &amp;quot;&lt;strong&gt;Open &lt;em&gt;filename&lt;/em&gt;&lt;/strong&gt;&amp;quot; (where &lt;em&gt;filename&lt;/em&gt; is the name of the file you want to open). The&amp;nbsp;&lt;span&gt;file extension is not required if it&amp;#39;s a *.cs file inside a C# project.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The file you specified should be opened immediately.&lt;/p&gt;&lt;p&gt;If either of these tests fail to work as expected, see the &lt;strong&gt;Troubleshooting&lt;/strong&gt; section below.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#404040;font-family:&amp;#39;Open Sans Condensed&amp;#39;, HelveticaNeue-CondensedBold, Helvetica, &amp;#39;Arial Narrow&amp;#39;, Calibri, Arial, &amp;#39;Lucida Grande&amp;#39;, sans-serif;font-size:30px;"&gt;Voice Feedback UI&lt;/span&gt;&lt;/p&gt;&lt;p&gt;When using Voice Features in Visual Studio, the Voice Feedback UI will appear&amp;nbsp;near the caret in the code. The&amp;nbsp;&lt;span&gt;Voice Feedback UI shows &lt;strong&gt;live microphone volume levels &lt;/strong&gt;when speaking (while one of the &lt;strong&gt;Ctrl&lt;/strong&gt; keys is held down), and provides a color-coded animation and label corresponding to the kind of Voice Feature&amp;nbsp;you are using.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;For example, when naming a new identifier, you&amp;#39;ll see feedback that might look something like&amp;nbsp;this while you&amp;#39;re speaking:&lt;/span&gt;&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/NewIdentifierWithBorder.gif" alt="" style="width:229px;height:51.9067px;"&gt;&lt;p&gt;Once the Ctrl key is held down and from the moment you start talking, CodeRush immediately starts an audio streaming session with Azure Cognitive Services&amp;nbsp;and the feedback UI starts to fade in. You can abort the session by pressing any non-modifier key, by moving the mouse a short distance, or by clicking the mouse. You can stop the streaming session and use the intended Voice Feature&amp;nbsp;&lt;span&gt;by simply releasing the Ctrl key when you are done speaking.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The Voice Feedback UI has other appearances:&lt;/p&gt;&lt;p&gt;When entering expressions in code (or inside interpolated strings), the animation is &lt;strong&gt;orange&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/Expressions.png" alt=""&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;When dictating&amp;nbsp;comments, strings, and some TextFields and TextBoxes (any place&amp;nbsp;where human-readable display text might be expected) the feedback UI animation is &lt;strong&gt;green &lt;/strong&gt;and the label describes what CodeRush is listening for:&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/CommentDictation.png" alt=""&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/InterpolatedString.png" alt=""&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;If the Alt key is held down while speaking (useful for referencing code inside comment or string dictations), the animation goes to &lt;strong&gt;orange &lt;/strong&gt;(to indicate code expressions can be spoken) and an indicator to the right shows the &lt;strong&gt;Alt&lt;/strong&gt; key is down:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/SimpleExpressionInString.png" alt="" style="width:194px;height:29px;"&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;When referencing a code &lt;strong&gt;symbol &lt;/strong&gt;from inside an XML Doc Comment (by holding down the Alt key), the animation turns &lt;strong&gt;purple &lt;/strong&gt;and there&amp;#39;s an indicator to the right:&lt;/p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/XmlDocCommentSymbol.png" alt="" style="width:187px;height:29px;"&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;As shown earlier, new identifiers are &lt;strong&gt;pink&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/NewIdentifier.png" alt="" style="width:206px;height:29px;"&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Type references&lt;/strong&gt; are &lt;strong&gt;yellow&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/TypeReference.png" alt="" style="width:214px;height:31.5867px;"&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;And when listening for &lt;strong&gt;voice&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;commands&lt;/strong&gt;, the animation is &lt;strong&gt;blue&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/VoiceCommands.png" alt="" style="width:201px;height:43px;"&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Each of these different modes represents different voice processing engines working in the background to turn your spoken words into something sensible.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#404040;font-family:&amp;#39;Open Sans Condensed&amp;#39;, HelveticaNeue-CondensedBold, Helvetica, &amp;#39;Arial Narrow&amp;#39;, Calibri, Arial, &amp;#39;Lucida Grande&amp;#39;, sans-serif;font-size:30px;"&gt;Troubleshooting&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span&gt;The following suggestions may help resolve unexpected results with CodeRush Voice Features.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;Nothing happens when I hold the Ctrl key and speak.&lt;/h3&gt;&lt;p&gt;Bring up the CodeRush&amp;nbsp;&lt;strong&gt;IDE&lt;/strong&gt;\&lt;strong&gt;Cognitive&lt;/strong&gt;\&lt;strong&gt;General&amp;nbsp;&lt;/strong&gt;options page. Make sure you can see the volume indicator change as you speak. Also check the&amp;nbsp;&lt;strong&gt;IDE&lt;/strong&gt;\&lt;strong&gt;Cognitive&lt;/strong&gt;\&lt;strong&gt;General&amp;nbsp;&lt;/strong&gt;options page and verify your&amp;nbsp;&lt;strong&gt;Azure Speech Service&amp;nbsp;&lt;/strong&gt;API key is&amp;nbsp;entered correctly, and the &lt;strong&gt;Azure Speech Region &lt;/strong&gt;matches the region setting established for your key on the Azure portal (both of these Azure fields need valid values). Bring up Visual Studio&amp;#39;s&amp;nbsp;&lt;strong&gt;Output&amp;nbsp;&lt;/strong&gt;tool window, in the&amp;nbsp;&lt;strong&gt;Show output from&amp;nbsp;&lt;/strong&gt;combobox&amp;nbsp;switch to the &amp;quot;&lt;strong&gt;Voice&lt;/strong&gt;&amp;quot; output page, and look for error messages here.&lt;br&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/OutputVoice.png" alt=""&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;I see a &amp;quot;No audio detected!&amp;quot; message on the&amp;nbsp;IDE\Cognitive\General&amp;nbsp;options page.&lt;/h3&gt;&lt;p&gt;Check your microphone to make sure it is not muted. Check your Windows&amp;nbsp;&lt;strong&gt;sound settings&amp;nbsp;&lt;/strong&gt;(right-click the speaker icon in the system tray and choose &amp;quot;&lt;strong&gt;Open sound settings&lt;/strong&gt;&amp;quot;).&lt;br&gt;&amp;nbsp;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/NoAudioDetected.png" alt=""&gt;&lt;br&gt;When you press the&amp;nbsp;&lt;strong&gt;Ctrl&lt;/strong&gt;&amp;nbsp;key, CodeRush listens to the&amp;nbsp;&lt;strong&gt;default sound input device&lt;/strong&gt;&amp;nbsp;(microphone) selected on this Windows settings page. This page includes a&amp;nbsp;&amp;nbsp;&amp;quot;Test your microphone&amp;quot; UI where you can verify your microphone is sending audio to Windows.&lt;br&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/TestYourMicrophone.png" alt=""&gt;&lt;/p&gt;&lt;h3&gt;Voice Feedback UI hides unexpectedly while talking.&lt;/h3&gt;&lt;p&gt;Voice Features are designed to work when the Ctrl key is held down and no other keyboard or mouse input actions are performed. So make sure the mouse isn&amp;#39;t moving significantly or being clicked while you speak.&lt;/p&gt;&lt;h3&gt;Voice Recognition Seems to Have Difficulty Getting My Words or Does Nothing When I Speak&lt;/h3&gt;&lt;p&gt;Some microphones reset their volume to a lower level after a reboot or when the machine awakes&amp;nbsp;from a sleep state. If the volume indicator on the Voice Feedback window is low, try turning up the sensitivity on your microphone.&lt;/p&gt;&lt;h3&gt;Generated code/dictation sometimes misses&amp;nbsp;the last spoken word.&lt;/h3&gt;&lt;div&gt;Try keeping the &lt;strong&gt;Ctrl &lt;/strong&gt;key down just a moment longer as you finish speaking.&lt;/div&gt;&lt;h3&gt;Generated code isn&amp;#39;t quite right.&lt;/h3&gt;&lt;div&gt;Suggestions:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Try a second time (make sure you&amp;#39;re holding the &lt;strong&gt;Ctrl &lt;/strong&gt;key down for the entire time you are speaking). &lt;/li&gt;&lt;li&gt;If there is phonetic ambiguity, try disambiguating&amp;nbsp;by saying the words you might normally omit (e.g., &amp;quot;dot&amp;quot; to separate qualifiers, &amp;quot;with&amp;quot; to enter parens and specify arguments). &lt;/li&gt;&lt;li&gt;Bring up the &lt;strong&gt;Output &lt;/strong&gt;tool window and switch to the &amp;quot;&lt;strong&gt;Voice&lt;/strong&gt;&amp;quot; page, and review the data there to see if the words heard (listed in a column with timing data)&amp;nbsp;match&amp;nbsp;what was said.&lt;/li&gt;&lt;li&gt;If the words in the &lt;strong&gt;Voice Output&lt;/strong&gt; are correct but CodeRush still fails to generate the expected code, bind a shortcut to the&amp;nbsp;&lt;strong&gt;GetVoiceTestCaseData&lt;/strong&gt; command on the CodeRush &lt;strong&gt;IDE&lt;/strong&gt;\&lt;strong&gt;Shortcuts &lt;/strong&gt;options page, and try the Voice to Code again. &lt;/li&gt;&lt;/ul&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/GetVoiceTestCaseData2.png" alt="" style="width:375px;height:403px;"&gt;&lt;br&gt;If you can duplicate the issue, now press the shortcut bound to the &lt;strong&gt;GetVoiceTestCaseData&amp;nbsp;&lt;/strong&gt;command, then paste the clipboard text into an email and&amp;nbsp;review it (it will contain some code from where you tried the voice command and the data&amp;nbsp;we need to reproduce). Send it to support@devexpress.com (feel free to edit the included code to remove anything sensitive, or better yet, try to duplicate in a method that contains code you don&amp;#39;t mind sharing).&lt;/div&gt;&lt;h3&gt;Voice Features do not work in certain CodeRush text boxes.&lt;/h3&gt;&lt;div&gt;This is a known limitation we hope to resolve in a future release.&lt;/div&gt;&lt;h3&gt;Voice Features do not work&amp;nbsp;when IntelliRush&amp;nbsp;is up.&lt;/h3&gt;&lt;div&gt;&lt;span&gt;This is a known limitation. For now we recommend closing IntelliRush by pressing Escape before invoking voice features.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;span&gt;Voice Features sometimes do not work&amp;nbsp;when a tool window&amp;nbsp;has focus.&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span&gt;Voice features will not work when some of the &lt;strong&gt;older Visual Studio tool windows &lt;/strong&gt;(built under WinForms technology) are active.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;The work around is to give the editor focus first by pressing&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Escape&lt;/strong&gt;&amp;nbsp;(or clicking on the editor).&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Some of the older Visual Studio tool windows that block Voice Features include:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Breakpoints&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Properties (for winforms projects)&lt;/li&gt;&lt;li&gt;Resources&lt;/li&gt;&lt;li&gt;&lt;span&gt;​Toolbox&lt;/span&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Voice to Code seems to have problems when there are long pauses in the middle of an expression.&lt;/h3&gt;&lt;div&gt;Due to architectural and performance challenges, this is an issue that we may not be able to fix. We recommend trying again without the long pauses, or breaking the expression into two or more smaller expressions.&lt;/div&gt;&lt;h3&gt;I see an error message - &amp;quot;Cognitive features enabled but OpenAI Key is missing&amp;quot;&lt;/h3&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/CognitiveFeaturesEnabledButOpenAIKeyMissing.png" alt="" style="width:460px;height:33.0341px;"&gt;&lt;div&gt;This error message can occur if the &amp;quot;&lt;strong&gt;Enable Cognitive Features&lt;/strong&gt;&amp;quot; checkbox is checked but the field for the OpenAI API key is empty.&lt;/div&gt;&lt;p&gt;&lt;span&gt;We recommend adding a valid&amp;nbsp;OpenAI Key &lt;/span&gt;&lt;span&gt;on the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;Cognitive&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;API Keys&lt;/strong&gt;&lt;span&gt;&amp;nbsp;options page&lt;/span&gt;&lt;span&gt;, or clearing the&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;strong&gt;Enable Cognitive Features&lt;/strong&gt;&lt;span&gt;&amp;quot; checkbox on the&amp;nbsp;&lt;strong&gt;IDE&lt;/strong&gt;\&lt;strong&gt;Cognitive&lt;/strong&gt;\&lt;strong&gt;General&lt;/strong&gt;&amp;nbsp;options page.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/CognitiveFeaturesEnabled.png" alt=""&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;I see an error message - &amp;quot;OpenAI rejected your authorization, most likely due to an invalid API Key&amp;quot;&lt;/h3&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/OpenAI%20Rejected%20your%20authorization.png" alt="" style="width:573px;height:31.8319px;"&gt;&lt;div&gt;This error message can occur if the &amp;quot;&lt;strong&gt;Enable Cognitive Features&lt;/strong&gt;&amp;quot; checkbox is checked but the API key is invalid.&lt;/div&gt;&lt;p&gt;We recommend double-checking that your OpenAI Key has been correctly entered (&lt;span&gt;on the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;Cognitive&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;API Keys&lt;/strong&gt;&lt;span&gt;&amp;nbsp;options page&lt;/span&gt;), or clearing the&amp;nbsp;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;strong&gt;Enable Cognitive Features&lt;/strong&gt;&lt;span&gt;&amp;quot; checkbox on the &lt;strong&gt;IDE&lt;/strong&gt;\&lt;strong&gt;Cognitive&lt;/strong&gt;\&lt;strong&gt;General&lt;/strong&gt; options page.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;I see an error message - &amp;quot;Error at completions...&amp;quot;&lt;/h3&gt;&lt;p&gt;This error may indicate&amp;nbsp;your &lt;strong&gt;OpenAI model name &lt;/strong&gt;is &lt;strong&gt;incorrect&lt;/strong&gt; or has been &lt;strong&gt;deprecated &lt;/strong&gt;by OpenAI (&amp;quot;&lt;strong&gt;NotFound&lt;/strong&gt;&amp;quot; appears at the end of the message). This error message can also happen when&amp;nbsp;the &lt;span&gt;OpenAI model name&amp;nbsp;&lt;/span&gt;has not been specified (&amp;quot;&lt;strong&gt;BadRequest&lt;/strong&gt;&amp;quot; &lt;span&gt;appears at the end&lt;/span&gt;).&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/OpenAiModelNotFound.png" alt="" style="width:792px;height:33.0689px;"&gt;&lt;/p&gt;&lt;p&gt;We recommand bringing up&amp;nbsp;&lt;span&gt;the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;Cognitive&lt;/strong&gt;&lt;span&gt;\&lt;/span&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;span&gt;&amp;nbsp;options page&lt;/span&gt;&amp;nbsp;and verifying the text in the &lt;strong&gt;OpenAI Model Name &lt;/strong&gt;text box represents a valid OpenAI model name:&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/markmiller/Images/Voice/CognitiveFeaturesEnabled.png" alt=""&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Voice to Code takes longer than it should to generate code.&lt;/h3&gt;&lt;div&gt;This can happen when there are many possible code paths to consider, which seems to be caused by long spoken expressions containing multiple methods calls, each&amp;nbsp;with many possible overloads. The workaround for now is to&amp;nbsp;&lt;span&gt;break&amp;nbsp;the expression into two or more smaller expressions (e.g., start with the outermost method call, and work your way in).&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;span&gt;Voice Feedback UI has an&amp;nbsp;unexpected&amp;nbsp;color or label (which may lead to unexpected results).&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span&gt;Let us know how to reproduce. We are still working on integrating voice into all the CodeRush refactorings and templates. If you find one we&amp;#39;ve missed or got wrong, please let us know.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;And if you&amp;#39;re still having trouble, please contact our Support Center (support@devexpress.com).&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;More Voice Features&lt;/h2&gt;&lt;div&gt;&lt;span&gt;This release contains powerful features that support voice interaction in Visual Studio. Other posts documenting voice features in CodeRush:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-to-code-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice to Code&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2025/08/20/aigen-amp-aifind-in-coderush-for-visual-studio.aspx" target="_blank"&gt;AiGen &amp;amp; AiFind&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/string-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;String Dictation&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/comment-dictation-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Comment Dictation&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/03/02/voice-in-textfields-in-coderush-for-visual-studio.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left:40px;"&gt;&lt;a href="https://community.devexpress.com/blogs/markmiller/archive/2024/02/04/voice-commands-in-coderush-for-visual-studio.aspx" target="_blank"&gt;Voice Commands&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;&lt;div data-survey-id="250480b2-a10c-44e8-b657-28afff16d19f" data-survey-auth-required="false"&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 05 Mar 2024 08:00:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:387807</guid>
      <link>https://community.devexpress.com/Blogs/markmiller/archive/2023/06/21/jump-codes-in-coderush-for-visual-studio.aspx</link>
      <category domain="https://community.devexpress.com/Tags/Code+Navigation">Code Navigation</category>
      <category domain="https://community.devexpress.com/Tags/CodeRush">CodeRush</category>
      <category domain="https://community.devexpress.com/Tags/High+speed+coding">High speed coding</category>
      <category domain="https://community.devexpress.com/Tags/Navigation">Navigation</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio">Visual Studio</category>
      <category domain="https://community.devexpress.com/Tags/Visual+Studio+Extensions">Visual Studio Extensions</category>
      <title>Jump Codes in CodeRush for Visual Studio</title>
      <description>&lt;p&gt;We&amp;#39;ve released a new navigation feature for CodeRush that helps you move to any code (in any programming language) that you can see onscreen (even code in code windows dragged onto other monitors) in just a few keystrokes. The feature also helps you select code blocks with the fewest keystrokes.&lt;/p&gt;&lt;p&gt;The feature is called&amp;nbsp;&lt;span&gt;&lt;strong&gt;Jump Codes&lt;/strong&gt;, and here&amp;#39;s how it works:&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Look &lt;/strong&gt;at the location onscreen (inside any visible code window) where you would like to move.&lt;/li&gt;&lt;li&gt;Press &lt;strong&gt;Caps&lt;/strong&gt;+&lt;strong&gt;Tab &lt;/strong&gt;to bring up the&amp;nbsp;&lt;span&gt;JumpCodes UI&lt;/span&gt; (enable &lt;a href="https://docs.devexpress.com/CodeRushForRoslyn/403629/getting-started/keyboard-shortcuts/caps-as-a-modifier" target="_blank"&gt;Caps as a Modifier&lt;/a&gt; feature if needed).&lt;/li&gt;&lt;li&gt;Enter the displayed &lt;strong&gt;jump&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;code &lt;/strong&gt;at the target location.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Press &lt;strong&gt;Enter &lt;/strong&gt;to  land the caret at the&amp;nbsp;target.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Simple enough. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Caps&lt;/strong&gt;+&lt;strong&gt;Tab &lt;/strong&gt;to invoke, &lt;strong&gt;Enter &lt;/strong&gt;to land the caret&amp;nbsp;(and a jump code in between).&lt;/p&gt;&lt;p&gt;However, as you might expect from the CodeRush team, there is more power here, allowing you to cut, copy, select and get anywhere onscreen, using a ridiculously small number of keystrokes. The rest of this  post will dive into that power.&lt;/p&gt;&lt;h2&gt;Landing Variations&lt;/h2&gt;&lt;p&gt;After entering your Jump Code, pressing &lt;strong&gt;Enter &lt;/strong&gt;will land the caret on the left side of the active token. You can combine the &lt;strong&gt;Enter &lt;/strong&gt;key with one or more keyboard modifiers for different landing results.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com:443/blogs/markmiller/LandingOptions.png" alt="" style="width:243px;height:132px;"&gt;&lt;/p&gt;&lt;p&gt;For example, if you want to &lt;strong&gt;select &lt;/strong&gt;the token under the JumpCode, hold down the &lt;strong&gt;Shift&lt;/strong&gt; key while landing (&lt;strong&gt;Shift&lt;/strong&gt;+&lt;strong&gt;Enter&lt;/strong&gt;).&amp;nbsp;&lt;/p&gt;&lt;p&gt;If brackets follow the token, hold down the &lt;strong&gt;Ctrl &lt;/strong&gt;key while landing &lt;span&gt;(&lt;/span&gt;&lt;strong&gt;Ctrl&lt;/strong&gt;&lt;span&gt;+&lt;/span&gt;&lt;strong&gt;Enter&lt;/strong&gt;&lt;span&gt;)&amp;nbsp;&lt;/span&gt;to place the caret &lt;strong&gt;inside those brackets&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;If you want the caret on the right side of the token (or the right inside of the brackets), hold down the &lt;strong&gt;Alt &lt;/strong&gt;key while landing (&lt;strong&gt;Alt&lt;/strong&gt;+&lt;strong&gt;Enter&lt;/strong&gt;).&lt;/p&gt;&lt;p&gt;And all of these modifiers work with each other. So for example, if you want to land &lt;span&gt;selecting&amp;nbsp;&lt;/span&gt;the text inside brackets to the right of a token, press &lt;strong&gt;Ctrl&lt;/strong&gt;+&lt;strong&gt;Shift&lt;/strong&gt;+&lt;strong&gt;Enter&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;Using the Arrow Keys&lt;/h2&gt;&lt;p&gt;You can change the active token (and the active line) using the arrow keys if you like. Left &amp;amp; Right activate&amp;nbsp;the&amp;nbsp;token&amp;nbsp;on either side&amp;nbsp;and the Up&amp;nbsp;&amp;amp; Down keys activate&amp;nbsp;the row&amp;nbsp;above or below. The active token is emphasized and&amp;nbsp;surrounded by a red rectangle.&lt;/p&gt;&lt;h2&gt;Correcting Mistakes&lt;/h2&gt;&lt;p&gt;If you unintentionally select&amp;nbsp;the wrong row, you can press&amp;nbsp;&lt;strong&gt;Backspace&lt;/strong&gt;&amp;nbsp;to return to the initial row selection mode.&lt;/p&gt;&lt;p&gt;If you have selected the correct row and have selected the wrong token, keep yours eyes on that token - it will tell you what keys to press to activate it.&lt;/p&gt;&lt;p&gt;You can also drop the Jump Codes UI and return to the code window and location where you started by pressing&amp;nbsp;&lt;strong&gt;Escape&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;Working with Multiple Visible Code Windows&lt;/h2&gt;&lt;p&gt;If you are working with more than one visible code windows (e.g., floating TextViews scattered across multiple monitors), you can activate an inactive TextView by pressing the &lt;strong&gt;number key &lt;/strong&gt;associated with any jump code on that view (all jump codes in a view will start with the same number key).&amp;nbsp;&lt;/p&gt;&lt;p&gt;You can also activate code windows&amp;nbsp;by pressing &lt;strong&gt;Tab&lt;/strong&gt; (and &lt;strong&gt;Shift&lt;/strong&gt;+&lt;strong&gt;Tab&lt;/strong&gt;) to cycle through them.&lt;/p&gt;&lt;img src="https://community.devexpress.com:443/blogs/markmiller/MultiMontorsThumbnail.jpeg" alt="" style="width:700px;height:402px;"&gt;&lt;h2&gt;Landing at the End (or Start) of a Line&lt;/h2&gt;&lt;p&gt;You can immediately land at the &lt;strong&gt;end &lt;/strong&gt;of the active line by pressing &lt;strong&gt;Ctrl&lt;/strong&gt;+&lt;strong&gt;End&lt;/strong&gt;. &lt;/p&gt;&lt;p&gt;Similarly you can&amp;nbsp;&lt;span&gt;immediately &lt;span&gt;land at&amp;nbsp;&lt;/span&gt;the &lt;strong&gt;start &lt;/strong&gt;of the active line by pressing&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Ctrl&lt;/strong&gt;&lt;span&gt;+&lt;/span&gt;&lt;strong&gt;Home&lt;/strong&gt;&lt;span&gt;.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you want to &lt;strong&gt;select the entire line&lt;/strong&gt;,&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;just combine one of these shortcuts with the &lt;strong&gt;Shift &lt;/strong&gt;key (e.g., &lt;strong&gt;Ctrl&lt;/strong&gt;+&lt;strong&gt;Shift&lt;/strong&gt;+&lt;strong&gt;Home&lt;/strong&gt;).&lt;/p&gt;&lt;p&gt;And you can always change the active line using the arrow keys or by entering a jump code.&lt;/p&gt;&lt;h2&gt;Creating Selections&lt;/h2&gt;&lt;p&gt;There are a few ways to create selections.&lt;/p&gt;&lt;h3&gt;Land with the Shift Key&lt;/h3&gt;&lt;p&gt;As mentioned earlier, you can hold down the&amp;nbsp;&lt;strong&gt;Shift&amp;nbsp;&lt;/strong&gt;key whlle landing to select the token (&lt;strong&gt;Shift&lt;/strong&gt;+&lt;strong&gt;Enter&lt;/strong&gt;) or&amp;nbsp;the line (&lt;strong&gt;Ctrl&lt;/strong&gt;+&lt;strong&gt;Shift&lt;/strong&gt;+&lt;strong&gt;Home&lt;/strong&gt;).&amp;nbsp;&lt;/p&gt;&lt;p&gt;You can also select all the parameters in a method declaration or all the arguments passed to a method by activating the previous token (e.g., the method name token) and pressing&amp;nbsp;&lt;strong&gt;Ctrl&lt;/strong&gt;+&lt;strong&gt;Shift&lt;/strong&gt;+&lt;strong&gt;Enter&lt;/strong&gt;.&lt;/p&gt;&lt;h3&gt;Selection Expand&lt;/h3&gt;&lt;p&gt;You can press the CodeRush shortcut for Selection Increase (e.g., &lt;strong&gt;Ctrl&lt;/strong&gt;+&lt;strong&gt;W&lt;/strong&gt; or the &lt;strong&gt;Num Plus&lt;/strong&gt; key) to immediately drop the Jump Codes UI and invoke &lt;a href="https://docs.devexpress.com/CodeRushForRoslyn/120207/coding-assistance/selection-tools/selection-expand-reduce" target="_blank"&gt;Selection Expand&lt;/a&gt;&amp;nbsp;starting at the selected token. You can continue to invoke Selection Expand as needed to shape the selection.&lt;/p&gt;&lt;h3&gt;Dropping an Anchor&lt;/h3&gt;&lt;p&gt;You can drop an anchor by pressing &lt;strong&gt;Space&lt;/strong&gt; over an active token. This marks the end of the selection. An anchor icon indicates the anchored token. You can now enter a new Jump Code to indicate the other side of the selection. Pressing &lt;strong&gt;Enter &lt;/strong&gt;when a token is&amp;nbsp;anchored will land and create a selection running from&amp;nbsp;the anchored token to the token that was active when you pressed &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Anchored selections also work with CodeRush&amp;#39;s Smart Cut and Copy (more details below).&lt;/p&gt;&lt;h2&gt;Smart Cut/Copy&lt;/h2&gt;&lt;p&gt;Jump Codes enhaces the behavior of a cut or copy operation to save you some steps. To see how this works, lets start with an example. Let&amp;#39;s say you&amp;#39;re inside a document near the bottom of the view and you want to copy some text from the top and paste it right where you are. Here&amp;#39;s how you do that without reaching for the mouse:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Caps&lt;/strong&gt;+&lt;strong&gt;Tab&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Activate the token that starts the block you want to cut/copy (or&amp;nbsp;&lt;span&gt;create a selection with an anchor).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Press the&amp;nbsp;&lt;strong&gt;Copy&lt;/strong&gt; key. The block will be copied and the caret will return to place where you were right before.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Press &lt;strong&gt;Paste&lt;/strong&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span&gt;This even works across different open code windows.&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If you want to override CodeRush&amp;#39;s Smart Cut/Copy and only copy or cut the active token, you can press &lt;strong&gt;Space &lt;/strong&gt;before pressing the cut/copy key.&lt;/p&gt;&lt;p&gt;Smart Cut works in the same way, but it will also drop a transient marker at the cut location so you can return later if needed. This can be useful when moving or exchanging methods between two different locations in a single code window (or between two different code windows).&lt;/p&gt;&lt;h2&gt;Highly Optimized Efficiency&lt;/h2&gt;&lt;p&gt;Landing shortcuts are highly optimized and designed to get you get anywhere inside any code window you can see with the smallest amount of physical effort. So not only can you get anywhere using the fewest key presses, you do this with the &lt;strong&gt;shortest finger travel distance&lt;/strong&gt;. That means for many locations your fingertips will stay on the home row. And &lt;span&gt;a single letter key press on the home row is all it takes to&amp;nbsp;&lt;/span&gt;move the caret to the beginning of most lines in view.&lt;/p&gt;&lt;p&gt;If you are working with a non-Qwerty&amp;nbsp;keyboard layout (such as &lt;strong&gt;Dvorak&lt;/strong&gt; or &lt;strong&gt;Colemak&lt;/strong&gt;), you will want to &lt;strong&gt;select your keyboard layout &lt;/strong&gt;on the Jump Codes Options page.&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com:443/blogs/markmiller/JumpCodeOptions.png" alt="" style="width:786px;height:400px;"&gt;&lt;/p&gt;&lt;h2&gt;Scalable to Extremes&lt;/h2&gt;&lt;p&gt;Developers know more than most that it doesn&amp;#39;t make sense to place hard coded limits in your products. And the CodeRush team fully embraced the idea of Extreme Scalability in developing JumpCodes. JumpCodes works regardless of how tiny your font is or how many lines of code you have onscreen or how many editor views you have distributed across multiple monitors. &lt;/p&gt;&lt;p&gt;The steps are the same regardless of scale. You simply look where you want to be, enter the JumpCodes&amp;nbsp;shown at that location, and you are done.&lt;/p&gt;&lt;p&gt;In scenarios where a screen contains more than 26 lines of code (or when a line contains more than 25 tokens), you may have to press a letter key more than once (for example, in extreme situations a jump code might look line &amp;quot;aaabb&amp;quot;. In situations like this, just keep your eyes on the target and it will tell you what keys you need to press to activate it, even if you overshoot it.&lt;/p&gt;</description>
      <pubDate>Wed, 21 Jun 2023 09:00:00 Z</pubDate>
      <dc:creator>Mark Miller (DevExpress)</dc:creator>
    </item>
  </channel>
</rss>