<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>TaskWeaver Blog</title>
        <link>https://docusaurus.io/TaskWeaver/blog</link>
        <description>TaskWeaver Blog</description>
        <lastBuildDate>Thu, 13 Mar 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Vision input for the Planner]]></title>
            <link>https://docusaurus.io/TaskWeaver/blog/vision</link>
            <guid>https://docusaurus.io/TaskWeaver/blog/vision</guid>
            <pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://docusaurus.io/TaskWeaver/blog/vision#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
<p>We have supported vision input for the Planner role in TaskWeaver.
The Planner role is responsible for generating the high-level plan for the task.
The vision input is a new type of input that contains images.
This feature is useful when the task requires visual understanding.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-vision-input-is-supported-in-taskweaver">How vision input is supported in TaskWeaver<a href="https://docusaurus.io/TaskWeaver/blog/vision#how-vision-input-is-supported-in-taskweaver" class="hash-link" aria-label="Direct link to How vision input is supported in TaskWeaver" title="Direct link to How vision input is supported in TaskWeaver">​</a></h2>
<p>In TaskWeaver, we added a new role called <code>ImageReader</code> to read images and provide the image url (for remote images) or
the image encoded in base64 (for local images) to the Planner role.
To have this new role, you need to include it in the project configure file as follows:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"session.roles"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"planner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"code_interpreter"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"image_reader"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The ImageReader role takes the path or the url of the image as input and prepares a response Post for the Planner role. As described <a href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision?tabs=rest" target="_blank" rel="noopener noreferrer">here</a> for Azure OpenAI API, if the image is local, ImageReader need to encode the image in base64 and pass it to the API. If the image is remote, ImageReader need to provide the url of the image.
The Planner role can then use the image information for various tasks.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="an-example">An example<a href="https://docusaurus.io/TaskWeaver/blog/vision#an-example" class="hash-link" aria-label="Direct link to An example" title="Direct link to An example">​</a></h2>
<p>Let's ask the agent to describe any uploaded image.</p>
<p><img decoding="async" loading="lazy" alt="image_reader" src="https://docusaurus.io/TaskWeaver/assets/images/image_reader-88cc65f5b9b2195a49673c046f0f27d5.png" width="789" height="2757" class="img_ev3q"></p>
<p>The flow of the conversation is as follows:</p>
<!-- -->
<p>In the example above, the User talks to the agent in Web UI and uploads an image.
TaskWeaver also support providing the image path in console mode, either using the <code>/load</code> command or just include
the image path in the input message.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="extension">Extension<a href="https://docusaurus.io/TaskWeaver/blog/vision#extension" class="hash-link" aria-label="Direct link to Extension" title="Direct link to Extension">​</a></h2>
<p>If you look into the implementation of the ImageReader role, you will find that it is quite simple.
The key logic is shown in the following code snippet:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> image_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"http"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    image_content </span><span class="token operator">=</span><span class="token plain"> image_url</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    attachment_message </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Image from </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">image_url</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">isabs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">image_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        image_content </span><span class="token operator">=</span><span class="token plain"> local_image_to_data_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">image_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        image_content </span><span class="token operator">=</span><span class="token plain"> local_image_to_data_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">session_metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">execution_cwd</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> image_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    attachment_message </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Image from </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">image_url</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> encoded as a Base64 data URL."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">post_proxy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">update_attachment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    message</span><span class="token operator">=</span><span class="token plain">attachment_message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token builtin" style="color:rgb(189, 147, 249)">type</span><span class="token operator">=</span><span class="token plain">AttachmentType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">image_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    extra</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string" style="color:rgb(255, 121, 198)">"image_url"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> image_content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    is_end</span><span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>After the image url is obtained, the ImageReader role will encode the image in base64 if the image is local.
Then, it will create an attachment in the response Post and pass the image content to the Planner role.
To achieve this, the attachment is created with the type <code>AttachmentType.image_url</code> and the image content is
passed as extra data with the key <code>image_url</code>.</p>
<p>Therefore, if we want to support other scenarios with vision input, we can extend the ImageReader role by adding more logic
to handle different types of contents. One example is to support reading a document with text and images.
We can add an attachment for each image in the document and pass the list of attachments to the Planner role.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What makes a good agent reasoning framework?]]></title>
            <link>https://docusaurus.io/TaskWeaver/blog/reasoning</link>
            <guid>https://docusaurus.io/TaskWeaver/blog/reasoning</guid>
            <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[An agent can listen to the user's request, understand the context, make plans, take actions, observe the results, and respond to the user. Its behavior is driven by the reasoning process, which is the core of the agent's intelligence.]]></description>
            <content:encoded><![CDATA[<p>An agent can listen to the user's request, understand the context, make plans, take actions, observe the results, and respond to the user. Its behavior is driven by the reasoning process, which is the core of the agent's intelligence.</p>
<p>There are many techniques developed to build an agent reasoning framework. For example, Chain-of-Thought (CoT) is one of the most popular reasoning approaches that uses a chain of thought to generate next-step actions. Another technique is ReAct, where the agent reflect on its action results to adjust its future actions. In TaskWeaver, one of the key reasoning technique is task decomposition and tracking, where the agent breaks down a task into subtasks and keeps track of the progress of each subtask. The following snippet shows an example of task decomposition and tracking in TaskWeaver:</p>
<div class="language-commandline codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-commandline codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Request historical stock price data for MSFT from the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Request the forecasting model or method to be used for prediction &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Perform the prediction using the provided data and model &lt;interactively depends on 2&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Report the prediction results to the user &lt;interactively depends on 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Request historical stock price data for MSFT from the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Request the forecasting model or method to be used for prediction</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Perform the prediction using the provided data and model</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Report the prediction results to the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [current_plan_step] 1. Request historical stock price data for MSFT from the user</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The agent lists the steps of the plan and the current step it is working on. While the agent is working on the task, it keeps track of the current step. This is useful especially when the task is complex and requires multiple steps to complete. The agent can refer to the current step to know what to do next. Without task decomposition and tracking, the agent may lose track of the task and fail to complete it.</p>
<p>TaskWeaver also support ReAct-like reasoning. This is done by introducing multiple roles in the problem-solving process, especially the Planner and CodeInterpreter roles. The Planner role is responsible for planning the steps of the task, while the CodeInterpreter role is responsible for interpreting the code generated by the Planner. The Planner can reflect on the results of the CodeInterpreter and adjust the plan accordingly. In one round, the Planner and Code Interpreter can work together to complete a subtask with multiple interactions.</p>
<p>However, there are still situations where the agent reasoning framework can be improved. If you have read the discussion above, you may have noticed that CoT is not implemented in TaskWeaver.</p>
<p><strong>Why?</strong></p>
<p>In this article, we are focused on the reasoning in the Planner. In fact, the Code Interpreter has CoT implemented as shown in the following snippet:</p>
<div class="language-commandline codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-commandline codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [thought] To fetch historical stock price data for MSFT using yfinance, I will first try to import yfinance and download the data. If yfinance is not installed, I will provide instructions to install it.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [reply_type] python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [reply_content]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   import yfinance as yf</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   # Fetch historical stock price data for MSFT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   ticker = 'MSFT'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   msft_data = yf.download(ticker, start='2020-01-01', end='2025-01-01')</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   msft_data</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For the Planner, there are actually two places in the response schema where CoT can be implemented: before generating the <code>init_plan</code> and after the <code>current_plan_step</code>, as shown in the previous snippet. The former is to generate the initial plan, while the latter is to use Planner's reasoning capabilities to solve the current subtask.</p>
<p>The former was not implemented in TaskWeaver for two reasons: (1) to simplify the schema and save the reasoning time/prompt size; (2) the existing <code>init_plan</code> and <code>plan</code> already represent a thought process, and adding CoT may not bring significant benefits. But as the LLM becomes faster and cheaper, it is possible to add CoT to the Planner to improve the planning quality.</p>
<p>With reasoning for planning, the output of the Planner looks like this:</p>
<div class="language-commandline codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-commandline codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Human   ▶  predict msft's stock price in the next 7 days</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan_reasoning] The user wants to predict Microsoft's stock price for the next 7 days. This task involves time series forecasting, which requires historical stock price data and a forecasting model. However, the user hasn't provided any data or specified a model to use. I need to ask the user for more information.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Request historical stock price data from the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Ask the user to specify a forecasting model or confirm if a default model should be used</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Load the historical stock price data &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Train the forecasting model using the historical data &lt;interactively depends on 2 and 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   5. Predict the stock price for the next 7 days &lt;sequentially depends on 4&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   6. Report the prediction results to the user &lt;interactively depends on 5&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>It looks good, but it is not the most important part of this article. The latter is more interesting and also more challenging to implement than it looks.</p>
<p>Let's use an example to motivate the necessity and explain the challenges. The task is described as follows and all the data in it are fake:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token title important punctuation" style="color:rgb(248, 248, 242)">#</span><span class="token title important"> Task Instructions  </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(248, 248, 242)">##</span><span class="token title important"> Step 1: Extract Employee Data  </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Extract the following information from the employee summary:  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`Employee ID`</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`Department`</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`Project Code`</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`Role`</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`Manager`</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`Location`</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(248, 248, 242)">###</span><span class="token title important"> Employee Summary  </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">On April 10, 2025, a review was conducted for an employee with ID </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`E12345`</span><span class="token plain">. </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">The employee is part of the </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`Development`</span><span class="token plain"> department and is currently assigned to project code </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`"X987"`</span><span class="token plain">. </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">The role held is </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`"Software Engineer"`</span><span class="token plain"> under the supervision of manager </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`"J. Doe."`</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">The primary work location is </span><span class="token code-snippet code keyword" style="color:rgb(189, 147, 249);font-style:italic">`"Remote."`</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(248, 248, 242)">##</span><span class="token title important"> Step 2: Validate the Role  </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> Confirm if the role is recognized among the following: Software Engineer, Data Analyst, Project Manager, DevOps Specialist, QA Tester.  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> Check if the role is one of the recognized roles.  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token title important punctuation" style="color:rgb(248, 248, 242)">##</span><span class="token title important"> Step 3: Construct SQL Query  </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token title important">Prepare and print the SQL query using the extracted details:  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token title important"></span><span class="token title important punctuation" style="color:rgb(248, 248, 242)">===</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">FROM EmployeeRecords  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">WHERE EmployeeID = '{EmployeeID}'  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Department = '{Department}'  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND ProjectCode = '{ProjectCode}'  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Role = '{Role}'  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Manager = '{Manager}'  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Location = '{Location}'  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token title important">ORDER BY EmployeeID;  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token title important"></span><span class="token title important punctuation" style="color:rgb(248, 248, 242)">===</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The task has 3 steps: extract employee data, validate the role, and construct an SQL query. This would not be a hard problem for any ReAct based agents. Actually, for all the 3 steps, there is no need to call Code Interpreter. The Planner can reason through the task and generate the code directly. However, let's run it in TaskWeaver:</p>
<div class="language-commandline codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-commandline codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan_reasoning] The user has provided a task with specific instructions to be followed step by step. The task involves extracting employee data, validating the role, and constructing an SQL query. Each step is dependent on</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │    the completion of the previous one, so they must be executed in sequence.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list &lt;sequentially depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details &lt;sequentially depends on 2&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user &lt;interactively depends on 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [current_plan_step] 1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [stop] InProcess</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──● Please extract the following information from the employee summary: Employee ID, Department, Project Code, Role, Manager, and Location. The summary is: On April 10, 2025, a review was conducted for an employee with ID     </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   `E12345`. The employee is part of the `Development` department and is currently assigned to project code `"X987"`. The role held is `"Software Engineer"` under the supervision of manager `"J. Doe."` The primary work        </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   location is `"Remote."`</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [shared_memory_entry] Add the plan to the shared memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╰──● sending message to CodeInterpreter</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; CodeInterpreter &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [thought] I will extract the required information from the given employee summary using string manipulation techniques.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [reply_type] python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [reply_content]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_summary = "On April 10, 2025, a review was conducted for an employee with ID `E12345`. The employee is part of the `Development` department and is currently assigned to project code \"X987\". The role held is      </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   \"Software Engineer\" under the supervision of manager \"J. Doe.\" The primary work location is \"Remote.\""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   # Extracting information</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_id = employee_summary.split('ID `')[1].split('`')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   department = employee_summary.split('`')[3]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   project_code = employee_summary.split('project code \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   role = employee_summary.split('role held is \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   manager = employee_summary.split('manager \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   location = employee_summary.split('location is \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_id, department, project_code, role, manager, location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [verification] NONE</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [code_error] No code verification is performed.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [execution_status] SUCCESS</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [execution_result]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The execution of the generated python code above has succeeded</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The result of above Python code after execution is:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ('E12345', 'Development', 'X987', 'Software Engineer', 'J. Doe.', 'Remote.')</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [artifact_paths] []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──● The following python code has been executed:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_summary = "On April 10, 2025, a review was conducted for an employee with ID `E12345`. The employee is part of the `Development` department and is currently assigned to project code \"X987\". The role held is      </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   \"Software Engineer\" under the supervision of manager \"J. Doe.\" The primary work location is \"Remote.\""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   # Extracting information</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_id = employee_summary.split('ID `')[1].split('`')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   department = employee_summary.split('`')[3]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   project_code = employee_summary.split('project code \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   role = employee_summary.split('role held is \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   manager = employee_summary.split('manager \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   location = employee_summary.split('location is \"')[1].split('\"')[0]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_id, department, project_code, role, manager, location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The execution of the generated python code above has succeeded</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The result of above Python code after execution is:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ('E12345', 'Development', 'X987', 'Software Engineer', 'J. Doe.', 'Remote.')</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╰──● sending message to Planner</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan_reasoning] The employee data has been successfully extracted from the summary. The next step is to validate the role against the list of recognized roles.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list &lt;sequentially depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details &lt;sequentially depends on 2&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user &lt;interactively depends on 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [current_plan_step] 2. Validate the role against the recognized roles list.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [stop] InProcess</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──● Please validate if the role 'Software Engineer' is recognized among the following roles: Software Engineer, Data Analyst, Project Manager, DevOps Specialist, QA Tester.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [shared_memory_entry] Add the plan to the shared memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╰──● sending message to CodeInterpreter</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; CodeInterpreter &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [thought] I will validate if the role 'Software Engineer' is recognized among the given list of roles.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [reply_type] python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [reply_content]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   # Step 2: Validate the Role</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   recognized_roles = ["Software Engineer", "Data Analyst", "Project Manager", "DevOps Specialist", "QA Tester"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   role = "Software Engineer"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   is_role_recognized = role in recognized_roles</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   is_role_recognized</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [verification] NONE</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [code_error] No code verification is performed.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [execution_status] SUCCESS</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [execution_result]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The execution of the generated python code above has succeeded</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The result of above Python code after execution is:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   True</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [artifact_paths] []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──● The following python code has been executed:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   # Step 2: Validate the Role</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   recognized_roles = ["Software Engineer", "Data Analyst", "Project Manager", "DevOps Specialist", "QA Tester"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   role = "Software Engineer"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   is_role_recognized = role in recognized_roles</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   is_role_recognized</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The execution of the generated python code above has succeeded</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The result of above Python code after execution is:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   True</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╰──● sending message to Planner</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan_reasoning] The role 'Software Engineer' is recognized among the list of roles. The next step is to construct the SQL query using the extracted details.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list &lt;sequentially depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details &lt;sequentially depends on 2&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user &lt;interactively depends on 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [current_plan_step] 3. Construct the SQL query using the extracted details.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [stop] InProcess</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──● Please construct the SQL query using the extracted details: Employee ID 'E12345', Department 'Development', Project Code 'X987', Role 'Software Engineer', Manager 'J. Doe.', and Location 'Remote'. The SQL query should be  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   in the format provided in the task instructions.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [shared_memory_entry] Add the plan to the shared memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╰──● sending message to CodeInterpreter</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; CodeInterpreter &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [thought] I will construct the SQL query using the extracted details from the previous successful round.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [reply_type] python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [reply_content]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   # Step 3: Construct SQL Query</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_id = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   project_code = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   manager = 'J. Doe.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   location = 'Remote.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   sql_query = f"""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   WHERE EmployeeID = '{employee_id}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Department = '{department}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND ProjectCode = '{project_code}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Role = '{role}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Manager = '{manager}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Location = '{location}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ORDER BY EmployeeID;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   """</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   sql_query</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [verification] NONE</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [code_error] No code verification is performed.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [execution_status] SUCCESS</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [execution_result]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The execution of the generated python code above has succeeded</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The result of above Python code after execution is:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   WHERE EmployeeID = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND ProjectCode = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Manager = 'J. Doe.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Location = 'Remote.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ORDER BY EmployeeID;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [artifact_paths] []</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──● The following python code has been executed:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   # Step 3: Construct SQL Query</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   employee_id = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   project_code = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   manager = 'J. Doe.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   location = 'Remote.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   sql_query = f"""</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   WHERE EmployeeID = '{employee_id}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Department = '{department}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND ProjectCode = '{project_code}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Role = '{role}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Manager = '{manager}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Location = '{location}'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ORDER BY EmployeeID;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   """</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   sql_query</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The execution of the generated python code above has succeeded</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   The result of above Python code after execution is:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   WHERE EmployeeID = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND ProjectCode = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Manager = 'J. Doe.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Location = 'Remote.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ORDER BY EmployeeID;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╰──● sending message to Planner</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan_reasoning] The SQL query has been successfully constructed using the extracted employee details. The task is now complete, and the constructed SQL query can be reported to the user.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list &lt;sequentially depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details &lt;sequentially depends on 2&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user &lt;interactively depends on 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   1. Extract the specified employee data from the summary provided.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   2. Validate the role against the recognized roles list.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   3. Construct the SQL query using the extracted details.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   4. Report the constructed SQL query to the user.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [current_plan_step] 4. Report the constructed SQL query to the user.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [stop] Completed</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├──● The SQL query has been successfully constructed using the extracted details:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   WHERE EmployeeID = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND ProjectCode = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Manager = 'J. Doe.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   AND Location = 'Remote.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ORDER BY EmployeeID;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │   ```</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ├─► [shared_memory_entry] Add the plan to the shared memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ╰──● sending message to User</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> TaskWeaver ▶  The SQL query has been successfully constructed using the extracted details:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">WHERE EmployeeID = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND ProjectCode = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Manager = 'J. Doe.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Location = 'Remote.'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ORDER BY EmployeeID;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The log is quite lengthy, but it is quite clear and easy to understand. For each step, the Planner always asks the Code Interpreter to generate the code. Finally, the task is completed successfully. However, it is not the most efficient way to solve the task because the Planner can leverage its reasoning capabilities to extract information and construct the SQL query directly.</p>
<p>We have tried to add instructions in the Planner's prompt to emphasize the reasoning power, but the Planner still calls the Code Interpreter to generate the code. For a long time, we don't quite understand the reason behind this behavior. After many discussions and experiments, we finally realized that it is caused by the design of the Planner's response schema. The Planner needs to talk to another Role in the system each time. But if we want the Planner to use reasoning to solve the current subtask, who should the Planner talk to? Ideally, it should continue until the subtask that requires the Code Interpreter to generate the code. But how can we design the schema to support this? Because the Planner is explicitly tracking the progress, i.e., the <code>current_plan_step</code>, it is confusing to let the Planner continue the reasoning process through future steps.</p>
<p>We value the progress tracking more than the efficiency of the reasoning process, because this is critical for complex multi-step tasks. But we also want to improve the reasoning process to make the agent more intelligent. So, our choice is to add a special Role called <code>Recepta</code> to listen to the Planner's reasoning process when the Planner wants to use reasoning to solve the current subtask. The <code>Recepta</code> always answers "Got it. Please go ahead!" to the Planner. The Planner can then continue the reasoning process until the subtask that requires the Code Interpreter to generate the code. The <code>Recepta</code> is not a real Role in the system, but a design pattern to support the reasoning process in the Planner.</p>
<p>Now, let's look at the output of TaskWeaver with <code>Recepta</code>:</p>
<div class="language-commandline codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-commandline codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [plan_reasoning] The user has provided a set of instructions to follow step by step. The task involves extracting employee data from a summary, validating the role, and constructing an SQL query. I will follow these steps sequentially.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Extract the following information from the employee summary: `Employee ID`, `Department`, `Project Code`, `Role`, `Manager`, `Location`</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Validate the role &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Construct and print the SQL query using the extracted details &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Check the execution result and report the result to the user &lt;interactively depends on 1 and 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Extract information from the employee summary</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Validate the role</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Construct SQL query using the extracted details</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Report the result to the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [current_plan_step] 1. Extract information from the employee summary</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [stop] InProcess</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├──● Thought: I can read and comprehend the employee summary to extract the required information.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   Result: the `Employee ID` is `E12345`, the `Department` is `Development`, the `Project Code` is `X987`, the `Role` is `Software Engineer`, the `Manager` is `J. Doe`, and the `Location` is `Remote`.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [shared_memory_entry] Add the plan to the shared memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╰──● sending message to Recepta</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╭───&lt; Recepta &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├──● Got it. Now, please go ahead!</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╰──● sending message to Planner</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [plan_reasoning] I have extracted the information from the employee summary. The next step is to verify if the role is one of the recognized roles.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Extract the following information from the employee summary: `Employee ID`, `Department`, `Project Code`, `Role`, `Manager`, `Location`</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Validate the role &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Construct and print the SQL query using the extracted details &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Check the execution result and report the result to the user &lt;interactively depends on 1 and 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Extract information from the employee summary</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Validate the role</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Construct SQL query using the extracted details</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Report the result to the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [current_plan_step] 2. Validate the role</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [stop] InProcess</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├──● Thought: I can verify if the role is one of the recognized roles with my pattern matching capability.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   Thought: The recognized roles are `Software Engineer, Data Analyst, Project Manager, DevOps Specialist, QA Tester`.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   Result: The role is `Software Engineer`, which is recognized.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [shared_memory_entry] Add the plan to the shared memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╰──● sending message to Recepta</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╭───&lt; Recepta &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├──● Got it. Now, please go ahead!</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╰──● sending message to Planner</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╭───&lt; Planner &gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [plan_reasoning] I can prepare and print the SQL query using the extracted details to the User.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [init_plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Extract the following information from the employee summary: `Employee ID`, `Department`, `Project Code`, `Role`, `Manager`, `Location`</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Validate the role &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Construct and print the SQL query using the extracted details &lt;interactively depends on 1&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Check the execution result and report the result to the user &lt;interactively depends on 1 and 3&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [plan]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   1. Extract information from the employee summary</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   2. Validate the role</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   3. Construct SQL query using the extracted details</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   4. Report the result to the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [current_plan_step] 3. Construct and print the SQL query using the extracted details and report the result to the user</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [stop] Completed</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├──● The role is `Software Engineer`, which is recognized.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   Here is the SQL query using the extracted details:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   ```sql</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   WHERE EmployeeID = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   AND Department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   AND ProjectCode = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   AND Role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   AND Manager = 'J. Doe'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   AND Location = 'Remote'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   ORDER BY EmployeeID;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   ```</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├─► [shared_memory_entry] Add the plan to the shared memory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">╰──● sending message to User</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> TaskWeaver ▶  The role is `Software Engineer`, which is recognized.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Here is the SQL query using the extracted details:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SELECT EmployeeID, Department, ProjectCode, Role, Manager, Location</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">FROM EmployeeRecords</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">WHERE EmployeeID = 'E12345'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Department = 'Development'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND ProjectCode = 'X987'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Role = 'Software Engineer'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Manager = 'J. Doe'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">AND Location = 'Remote'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ORDER BY EmployeeID;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The new log is not only shorter but also more efficient. It is also more reliable according to our observations. Writing code with regex to extract information from text is error-prone.</p>
<p>In summary, we have experimented the idea of adding a special Role called <code>Recepta</code> to support the reasoning process in the Planner. The <code>Recepta</code> is not a real Role in the system, but a design pattern to support the reasoning process in the Planner. This design pattern is simple and effective. It is also flexible and can be extended to support more complex reasoning processes in the Planner. We believe that this design pattern can be useful for building more intelligent agents in the future.</p>
<p>To enable it in TaskWeaver, the user needs to configure the roles in the configure file with the following content:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token property">"session.roles"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"planner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"code_interpreter"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"recepta"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The <code>recepta</code> role is added to the list of roles.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Experience Selection in TaskWeaver]]></title>
            <link>https://docusaurus.io/TaskWeaver/blog/experience</link>
            <guid>https://docusaurus.io/TaskWeaver/blog/experience</guid>
            <pubDate>Sat, 14 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We have introduced the motivation of the experience module in Experience]]></description>
            <content:encoded><![CDATA[<p>We have introduced the motivation of the <code>experience</code> module in <a href="https://docusaurus.io/TaskWeaver/docs/customization/experience">Experience</a>
and how to create a handcrafted experience in <a href="https://docusaurus.io/TaskWeaver/docs/customization/experience/handcrafted_experience">Handcrafted Experience</a>.
In this blog post, we discuss more advanced topics about the experience module on experience selection.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="static-experience-selection">Static experience selection<a href="https://docusaurus.io/TaskWeaver/blog/experience#static-experience-selection" class="hash-link" aria-label="Direct link to Static experience selection" title="Direct link to Static experience selection">​</a></h2>
<p>Every role in TaskWeaver can configure its own experience directory, which can be configured
by setting the <code>role_name.experience_dir</code> field in the project configuration file.
For the <code>Planner</code> and <code>CodeInterpreter</code> roles, you can configure the experience directory
by setting the <code>planner.experience_dir</code> and <code>code_generator.experience_dir</code> fields respectively.
The default experience directory is <code>experience</code> in the project directory.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The role name is by default the name of the implementation file (without the extension) of the role unless
you have specified the role name by calling <code>_set_name</code> in the implementation file.</p></div></div>
<p>By configuring different experience directories for different roles,
you can have different experiences for different roles in a static way.
Use the <code>Planner</code> role as an example, you can have the following project configuration file
to enable the experience selection for the <code>Planner</code> role.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"planner.use_experience"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"planner.experience_dir"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"planner_exp_dir"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="dynamic-experience-selection">Dynamic experience selection<a href="https://docusaurus.io/TaskWeaver/blog/experience#dynamic-experience-selection" class="hash-link" aria-label="Direct link to Dynamic experience selection" title="Direct link to Dynamic experience selection">​</a></h2>
<p>In some cases, you may want to select the experience dynamically based on the input task.
In TaskWeaver, although we retrieve the experience based on the query content,
it is sometimes difficult to obtain the right experience based solely on the similarity
between the query content and the experience content.</p>
<p>One real example we encountered is that we need to retrieve the experience based on the
task type. We have many task types in the project, let's say <code>task_type_1</code>, <code>task_type_2</code>, and <code>task_type_3</code>.
Every task type is about following a set of instructions to complete a task.
Although different task types have different instructions, the instructions are similar in structure.
For example, they all have similar steps like <code>step_1</code>, <code>step_2</code>, and <code>step_3</code>, only
the content of the steps is slightly different for different task types.
Actually, even most of the step titles are the same for different task types.</p>
<p>Each task type has its own experience, and we want to select the experience based on the task type.
Even though we can mix all the experiences into one experience directory, it is very hard
to differentiate the experiences based on the user input or the step content.
In this project, the user input is simply a task ID, and we need to first figure out the task type based on the task ID,
and then select the experience based on the task type.</p>
<p>To achieve this, we add a layer in the experience selection process. Specifically, we allow
having subdirectories in the experience directory.
For example, we can have the following experience directory structure:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">planner_experience</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── task_type_1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   ├── exp_1.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   ├── exp_2.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── ...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>When we can identify the task type based on the task ID, we can set the experience subdirectory.
This looks straightforward, but how can we set the experience subdirectory in TaskWeaver?
As we need to do this in a dynamic way, the only way is to set the experience subdirectory in a <a href="https://docusaurus.io/TaskWeaver/docs/concepts/role">role</a>.</p>
<p>TaskWeaver recently introduced the concept of shared memory as discussed in <a href="https://docusaurus.io/TaskWeaver/docs/memory">Shared Memory</a>.
Shared memory allows a role to share information with other roles, and in this case, we can use shared memory to set the experience subdirectory.</p>
<p>We can add a new role called <code>TaskTypeIdentifier</code> to identify the task type based on the task ID.
The key part of the <code>reply</code> function in <code>TaskTypeIdentifier</code> is shown below:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token operator">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> Post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># get the task type from the last post message</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    task_type </span><span class="token operator">=</span><span class="token plain"> get_task_type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">last_post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># create an attachment </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    post_proxy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">update_attachment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token builtin" style="color:rgb(189, 147, 249)">type</span><span class="token operator">=</span><span class="token plain">AttachmentType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">shared_memory_entry</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        message</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"Add experience sub path"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        extra</span><span class="token operator">=</span><span class="token plain">SharedMemoryEntry</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">create</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token builtin" style="color:rgb(189, 147, 249)">type</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"experience_sub_path"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            scope</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"conversation"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># define the effective scope of the shared memory entry to be the whole conversation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            content</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"task_type_1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> post_proxy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">end</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In a role that needs to set the experience subdirectory, we can get the experience subdirectory from the shared memory.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        post_proxy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">PostEventProxy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        prompt_log_path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token operator">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> Post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    rounds </span><span class="token operator">=</span><span class="token plain"> memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">get_role_rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        role</span><span class="token operator">=</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">alias</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        include_failure_rounds</span><span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># obtain the query from the last round</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    query </span><span class="token operator">=</span><span class="token plain"> rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">post_list</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">message</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># retrieve the experience based on the query</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">role_load_experience</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">query</span><span class="token operator">=</span><span class="token plain">query</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> memory</span><span class="token operator">=</span><span class="token plain">memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>This is the current experimental feature in TaskWeaver which is subject to change.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://docusaurus.io/TaskWeaver/blog/experience#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In this blog post, we have discussed how to select experiences in TaskWeaver.
We have static experience selection by configuring the experience directory for each role.
To enable dynamic experience selection, we have introduced the concept of shared memory to set the experience subdirectory.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Run TaskWeaver with Locally Deployed Not-that-Large Language Models]]></title>
            <link>https://docusaurus.io/TaskWeaver/blog/local_llm</link>
            <guid>https://docusaurus.io/TaskWeaver/blog/local_llm</guid>
            <pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[The feature introduced in this blog post can cause incompatibility issue with the previous version of TaskWeaver]]></description>
            <content:encoded><![CDATA[<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The feature introduced in this blog post can cause incompatibility issue with the previous version of TaskWeaver
if you have customized the examples for the planner and code interpreter.
The issue is easy to fix by changing the examples to the new schema.
Please refer to the <a href="https://docusaurus.io/TaskWeaver/blog/local_llm#how-we-implemented-the-constrained-generation-in-taskweaver">How we implemented the constrained generation in TaskWeaver</a> section for more details.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="motivation">Motivation<a href="https://docusaurus.io/TaskWeaver/blog/local_llm#motivation" class="hash-link" aria-label="Direct link to Motivation" title="Direct link to Motivation">​</a></h2>
<p>We've seen many raised issues complaining that it is difficult to run TaskWeaver
with locally deployed non-that-large language models (LLMs), such as 7b or 13b.
When we examine the issues, we find that the main problem is that the models failed
to generate responses following our formatting instructions in the prompt. For instance,
we see that the planner's response does not contain a <code>send_to</code> field, which is required
to determine the recipient of the message.</p>
<p>In the past, we have tried to address this issue by adding more examples in the prompt,
which however did not work well, especially for these relatively small models. Another idea
was to ask the model to re-generate the response if it does not follow the format.
We include the format error in the prompt to help the model understand the error and
correct it. However, this approach also did not work well.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="constrained-generation">Constrained Generation<a href="https://docusaurus.io/TaskWeaver/blog/local_llm#constrained-generation" class="hash-link" aria-label="Direct link to Constrained Generation" title="Direct link to Constrained Generation">​</a></h2>
<p>Recently, we discovered a new approach called "Constrained Generation" that can enforce
the model to generate responses following the format. Popular frameworks include <a href="https://github.com/outlines-dev/outlines" target="_blank" rel="noopener noreferrer">Outlines</a>,
<a href="https://github.com/guidance-ai/guidance" target="_blank" rel="noopener noreferrer">Guidance</a>, <a href="https://github.com/noamgat/lm-format-enforcer/tree/main" target="_blank" rel="noopener noreferrer">lm-format-enforcer</a>, etc.
All these frameworks support generating responses following a specific format, e.g., a JSON schema.
This makes it possible to control the output format by providing it a schema.</p>
<p>In TaskWeaver, a relatively easy way to integrate this feature is to use a local deployment that supports
both constrained generation and OpenAI compatible API, for instance, the <a href="https://docs.vllm.ai/en/stable/serving/openai_compatible_server.html" target="_blank" rel="noopener noreferrer">vllm</a>.
There are other frameworks that support constrained generation, such as llama.cpp.
But currently, we found that this feature is still not mature enough, so we start with vllm for experimentation.</p>
<p>To run vllm, you can follow the instructions in the <a href="https://docs.vllm.ai/en/stable/serving/openai_compatible_server.html" target="_blank" rel="noopener noreferrer">vllm documentation</a>.
A simple example is shown below:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">python </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-m</span><span class="token plain"> vllm.entrypoints.openai.api_server </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--model</span><span class="token plain"> meta-llama/Meta-Llama-3-8B-Instruct --guided-decoding-backend lm-format-enforcer</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>where <code>--guided-decoding-backend lm-format-enforcer</code> is used to enable the constrained generation feature and
specify the backend. Currently, vllm only supports <code>lm-format-enforcer</code> and <code>outlines</code>.</p>
<p>Here is a sample code to test the vllm server:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> openai </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> OpenAI</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">json_schema </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"properties"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"country_name"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"required"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"country_name"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">openai_api_key </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMPTY"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">openai_api_base </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://localhost:8000/v1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">client </span><span class="token operator">=</span><span class="token plain"> OpenAI</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    api_key</span><span class="token operator">=</span><span class="token plain">openai_api_key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    base_url</span><span class="token operator">=</span><span class="token plain">openai_api_base</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">completion </span><span class="token operator">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">chat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">completions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">create</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    model</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"meta-llama/Meta-Llama-3-8B-Instruct"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    messages </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string" style="color:rgb(255, 121, 198)">"role"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"system"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"content"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"You are a helpful assistant."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string" style="color:rgb(255, 121, 198)">"role"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"content"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Which country is San Francisco in?"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    extra_body</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"guided_json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> json_schema</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"guided_decoding_backend"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"lm-format-enforcer"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">                           </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Completion result:"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> completion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If you run the above code, you will get the response following the format specified in the <code>json_schema</code>.</p>
<p>After you have successfully deployed vllm, you can set the following configurations in TaskWeaver:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"llm.model"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"meta-llama/Meta-Llama-3-8B-Instruct"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"llm.api_base"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://localhost:8000/v1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"llm.api_key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"null"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"llm.api_type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"openai"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"llm.openai.require_alternative_roles"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"llm.openai.support_system_role"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The <code>llm.openai.require_alternative_roles</code> and <code>llm.openai.support_system_role</code> configurations are
discussed in the <a href="https://docusaurus.io/TaskWeaver/docs/configurations/configurations_in_detail">OpenAI Configuration</a> page.
With these configurations, TaskWeaver will send the messages to the vllm server and get the responses.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-we-implemented-the-constrained-generation-in-taskweaver">How we implemented the constrained generation in TaskWeaver<a href="https://docusaurus.io/TaskWeaver/blog/local_llm#how-we-implemented-the-constrained-generation-in-taskweaver" class="hash-link" aria-label="Direct link to How we implemented the constrained generation in TaskWeaver" title="Direct link to How we implemented the constrained generation in TaskWeaver">​</a></h2>
<p>In order to support the constrained generation in TaskWeaver, we need to provide the schema to the model.
Therefore, we made a few changes in the code to support this feature.</p>
<p>First, we add a <code>response_json_schema</code> field to the planner and code interpreter. For planner, you can find
it in <code>taskweaver/planner/planner_prompt.py</code>. It looks like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">response_json_schema</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">"properties"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">"response"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">"properties"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"init_plan"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"plan"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"current_plan_step"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"send_to"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"message"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">"required"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"init_plan"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"plan"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"current_plan_step"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"send_to"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"message"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">"required"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"response"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If you are familiar with the previous output schema, you may notice that we have changed the <code>response</code> field to an object
from an array of elements. This is because that it is much easier to express the schema in JSON format if
the properties are in an object, not elements in an array.</p>
<p>Correspondingly, we add a <code>response_json_schema</code> field to the code interpreter. You can find it in <code>taskweaver/code_interpreter/code_interpreter/code_generator_prompt.py</code>,
which looks like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">response_json_schema</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">"properties"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">"response"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"properties"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"thought"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"reply_type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token key atrule">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"python"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"text"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token key atrule">"reply_content"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token key atrule">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">"required"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"thought"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"reply_type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"reply_content"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">"required"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"response"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We also change the <code>response</code> field to an object from an array of elements in the code interpreter.
A benefit of this change is that we can now easily restrict the <code>reply_type</code> field to only two values: <code>python</code> and <code>text</code>,
which is not possible before.</p>
<p>One consequence of this change is that we need to modify the examples for the code interpreter in order
to support the new schema. The old examples contain attachments that have the types of
<code>python</code>, <code>text</code>, and <code>sample</code>, which are deprecated. We now need to change them to the new schema.
Specifically, we need to change the <code>type</code> field to <code>reply_type</code> and the <code>content</code> field to <code>reply_content</code>.
For example, the old example:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> python</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    file_path = "/abc/def.txt"  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    with open(file_path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> "r") as file</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        file_contents = file.read()  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        print(file_contents)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>should be changed to:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> reply_type</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> python </span><span class="token comment" style="color:rgb(98, 114, 164)"># or 'text' if the old type is 'text' or 'sample'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> reply_content</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    file_path = "/abc/def.txt"  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    with open(file_path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> "r") as file</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        file_contents = file.read()  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        print(file_contents)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>There could be multiple <code>thought</code> attachments in the code interpreter examples.
But in the new schema, there is only one <code>thought</code> field. So we have added code to do the conversion and no
manual work is needed to modify the examples.
If you have examples, after these changes, we can now support the constrained generation in TaskWeaver.</p>
<p>Second, we submit the JSON schema to the model when we need to call the endpoint,
which you can find in <code>planner.py</code> and <code>code_generator.py</code>, respectively.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://docusaurus.io/TaskWeaver/blog/local_llm#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In this blog post, we have introduced a new feature called "Constrained Generation" that can enforce the model to generate responses following the format.
We have also shown how to run TaskWeaver with locally deployed non-that-large language models (LLMs) that support constrained generation.
We have also explained how we implemented the constrained generation in TaskWeaver. We hope this feature can help you run TaskWeaver with LLMs more easily.
If you have any questions or suggestions, please feel free to contact us.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Plugins In-Depth]]></title>
            <link>https://docusaurus.io/TaskWeaver/blog/plugin</link>
            <guid>https://docusaurus.io/TaskWeaver/blog/plugin</guid>
            <pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[**Pre-requisites**: Please refer to the Introduction and the Plugin Development]]></description>
            <content:encoded><![CDATA[<p><em><strong>Pre-requisites</strong>: Please refer to the <a href="https://docusaurus.io/TaskWeaver/docs/plugin/plugin_intro">Introduction</a> and the <a href="https://docusaurus.io/TaskWeaver/docs/plugin/how_to_develop_a_new_plugin">Plugin Development</a>
pages for a better understanding of the plugin concept and its development process.</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="plugin-basics">Plugin Basics<a href="https://docusaurus.io/TaskWeaver/blog/plugin#plugin-basics" class="hash-link" aria-label="Direct link to Plugin Basics" title="Direct link to Plugin Basics">​</a></h2>
<p>In TaskWeaver, the plugins are the essential components to extend the functionality of the agent.
Specifically, a plugin is a piece of code wrapped in a class that can be called as a function by the agent in the generated code snippets.
The following is a simple example of a plugin that generates <code>n</code> random numbers:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> taskweaver</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">plugin </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> Plugin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> register_plugin</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@register_plugin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">RandomGenerator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">Plugin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__call__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">int</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> random</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">random</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">randint</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> _ </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">range</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">n</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In this example, the <code>RandomGenerator</code> class inherits the <code>Plugin</code> class and implements the <code>__call__</code> method, which means
it can be called as a function. What would be the function signature of the plugin?
It is defined in the associated YAML file. For example, the YAML file for the <code>RandomGenerator</code> plugin is as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> random_generator</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  This plugin generates n random numbers between 1 and 100.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">examples</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  result = random_generator(n=5)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">parameters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> n</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> int</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      The number of random numbers to generate.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">returns</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> result</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> list</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      The list of random numbers.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The YAML file specifies the name, description, parameters, and return values of the plugin.
When the LLM generates the code snippets, it will use the information in the YAML file to generate the function signature.
We did not check the discrepancy between the function signature in the Python implementation and the YAML file.
So, it is important to keep them consistent.
The <code>examples</code> field is used to provide examples of how to use the plugin for the LLM.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="configurations-and-states">Configurations and States<a href="https://docusaurus.io/TaskWeaver/blog/plugin#configurations-and-states" class="hash-link" aria-label="Direct link to Configurations and States" title="Direct link to Configurations and States">​</a></h2>
<p>Although the plugin is used as a function in the code snippets, it is more than a normal Python function.
The plugin can have its own configurations and states.
For example, the <code>RandomGenerator</code> plugin can have a configuration to specify the range of the random numbers.
The configurations can be set in the YAML file as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># the previous part of the YAML file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">configurations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> range</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> list</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      The range of the random numbers.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We did not show how to use the configurations in the plugin implementation,
which could be found in one of our sample plugins, namely <a href="https://github.com/microsoft/TaskWeaver/blob/main/project/plugins/sql_pull_data.yaml" target="_blank" rel="noopener noreferrer">sql_pull_data</a>.
Supporting configurations in the plugin is a powerful feature to make the plugin more flexible and reusable.
For example, we can have multiple YAML files pointing to the same Python implementation but with different configurations.
Read this <a href="https://docusaurus.io/TaskWeaver/docs/plugin/multi_yaml_single_impl">page</a> for more details. When TaskWeaver loads the plugins,
it will elaborate the YAML files and create the plugin objects with the configurations. Therefore, two plugins with the same Python implementation
but different configurations are actually different objects in memory.
That is why different plugins can have different states, and this is especially helpful when the plugin needs
to maintain some states across different calls. Consider the example of the <code>sql_pull_data</code> sample plugin, which has the following
code snippet:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@register_plugin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">SqlPullData</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">Plugin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    db </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__call__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">db </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">is</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">db </span><span class="token operator">=</span><span class="token plain"> SQLDatabase</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">from_uri</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"sqlite_db_path"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In the example above, the <code>SqlPullData</code> plugin maintains a database connection across different calls.
If we design the plugin to be a stateless normal Python function, we would need to establish a new connection for each call,
which is inefficient and not necessary.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-plugin-lifecycle">The Plugin Lifecycle<a href="https://docusaurus.io/TaskWeaver/blog/plugin#the-plugin-lifecycle" class="hash-link" aria-label="Direct link to The Plugin Lifecycle" title="Direct link to The Plugin Lifecycle">​</a></h2>
<p>The plugin lifecycle is the process of how the plugin is loaded, initialized, and called by the agent.
When TaskWeaver starts, it goes through all the plugin configuration files in the <code>plugins</code> directory
and creates the plugin entries in the memory. The Python implementation of the plugin is not loaded at this stage.
When the agent generates the code snippets, it will call the plugin by the name specified in the YAML file,
and fill in the function signature based on the information in the YAML file.</p>
<p>The plugin is loaded and initialized when the code executor executes the code snippets for the first time
in a session.
The plugin is initialized with the configurations specified in the YAML file.
Although we have the <a href="https://docusaurus.io/TaskWeaver/docs/advanced/plugin_selection">feature</a> to dynamically select the plugins in the LLM, all the plugins are loaded
no matter whether they are used in the current conversation round. The only way of controlling the plugin loading is to
enable or disable the plugin in the YAML file.
In theory, the plugins can be configured separately for different sessions.
For example, when a user starts a new session, we can load a different set of plugins based on the user's profile.
But this feature is <strong>not</strong> supported in TaskWeaver yet.</p>
<p>The plugin is called when the agent executes the code snippets. The plugin can maintain states across different calls,
which has been discussed in the previous section. As each session is associated with a Jupyter kernel,
the plugin objects are created in the kernel memory and can be accessed across different code snippets, from different code cells,
in the same session.
When the session is closed, the plugin objects are also destroyed with the kernel.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://docusaurus.io/TaskWeaver/blog/plugin#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In this page, we discussed the basics of the plugin in TaskWeaver, including the plugin implementation, the YAML file,
the configurations, and the states. We also introduced the plugin lifecycle, which is the process of how the plugin is loaded, initialized, and called by the agent.
The plugin is a powerful component in TaskWeaver to extend the functionality of the agent.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to evaluate a LLM agent?]]></title>
            <link>https://docusaurus.io/TaskWeaver/blog/evaluation</link>
            <guid>https://docusaurus.io/TaskWeaver/blog/evaluation</guid>
            <pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[The challenges]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-challenges">The challenges<a href="https://docusaurus.io/TaskWeaver/blog/evaluation#the-challenges" class="hash-link" aria-label="Direct link to The challenges" title="Direct link to The challenges">​</a></h2>
<p>It is nontrivial to evaluate the performance of a LLM agent.
Existing evaluation methods typically treat the LLM agent as a function that maps input data to output data.
If the agent is evaluated against a multi-step task, the evaluation process is then like a chain of calling a stateful function multiple times.
To judge the output of the agent, it is typically compared to a ground truth or a reference output.
As the output of the agent is in natural language, the evaluation is typically done by matching keywords or phrases in the output to the ground truth.</p>
<p>This evaluation method has its limitations due to its rigid nature.
It is sometimes hard to use keywords matching to evaluate the output of the agent, especially when the output is long and complex.
For example, if the answer is a date or a number, the evaluation method may not be able to handle the different formats.
Moreover, the evaluation method should be able to act more like a human, who can understand the context and the meaning of the output.
For example, when different agents are asked to perform the same task, they may behave differently, but still produce correct outputs.</p>
<p>The below example illustrates this point:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Human: What is the weather today?</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Agent 1: It is sunny today in New York.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Human: What is the weather today?</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Agent 2: Do you want to know the weather in New York today?</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Human: Yes.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Agent 2: It is sunny today.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Compared to Agent 1, Agent 2 asks for confirmation before providing the answer, which requires more interaction with the user.
However, both agents provide the correct answer to the question.
But if the evaluation method takes the agent as a function, it may not be able to handle the different behaviors of the agents
and consider Agent 2 as incorrect (as the first response does not match the ground truth, e.g., "sunny").</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-new-evaluation-method">A new evaluation method<a href="https://docusaurus.io/TaskWeaver/blog/evaluation#a-new-evaluation-method" class="hash-link" aria-label="Direct link to A new evaluation method" title="Direct link to A new evaluation method">​</a></h2>
<p>Therefore, we propose a new evaluation method that treats the agent as a conversational partner as shown in the figure below:
<img decoding="async" loading="lazy" alt="Evaluation" src="https://docusaurus.io/TaskWeaver/assets/images/evaluation-ac91a46e949f383154a9ffbafcfbc981.png" width="965" height="659" class="img_ev3q"></p>
<p>We introduce two new roles during the evaluation process: the <strong>Examiner</strong> and the <strong>Judge</strong>.
For each test case, the task description is first given to the Examiner.
The Examiner then asks questions to the agent and supervises the conversation.
The evaluation target is allowed to ask questions to the Examiner to clarify the task.
The Examiner can only provide the task description and cannot provide any hints or solutions.
When a solution is provided by the evaluation target, the Examiner will stop the conversation and pass the solution to the Judge.
The Judge will then evaluate the solution based on the ground truth.
Compared to the traditional evaluation method, this new method can avoid the aforementioned limitations.</p>
<p>Let's see an example of how the new evaluation method works. The following YAML file is a task description for the task "Sum of 1 to 50".
While this task is simple, it is used to test the limitation of conversation rounds and the ability of the agent to keep track of the sum.
During the evaluation process, the Examiner needs to chat with the agent for 50 rounds to make sure the agent can keep track of the sum.
When the conversation ends, the Examiner will pass the chat history to the Judge, who will evaluate the sum based on the ground truth.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">task_description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  The task has many rounds. The initial total sum is 0. </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Starting from round 1 to round 50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> you should ask the agent to add the current round number to the total sum.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  The agent should keep track of the sum and return the sum after the 50th round.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Every round</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> you only need to ask the agent to add the current round number to the total sum and report the sum to you.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">scoring_points</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">score_point</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> The agent succeeds in 10 rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> the sum should be 55.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">score_point</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> The agent succeeds in 20 rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> the sum should be 210.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">score_point</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> The agent succeeds in 30 rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> the sum should be 465.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">score_point</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> The agent succeeds in 40 rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> the sum should be 820.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">score_point</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> The agent succeeds in 50 rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> the sum should be 1275.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">5</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The ground truth is represented by the <code>scoring_points</code> field in the YAML file.
Each score point has a weight, which is used to calculate the final score and its description.
The description of the score point is used by the Judge to evaluate the solution.
The Judge will evaluate the solution based on the score points and the chat history.
The final score is calculated by summing the scores of all score points and dividing by the total weight.
Therefore, the normalized score is between 0 and 1.</p>
<p>In some cases, it may require a more precise way to evaluate the solution, e.g., with code.
This following task description is an example of such a case.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">task_description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  The task is to send 3 requests one</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">by</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">one and get the agent responses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token key atrule">no need to check the response content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  1. generate 1 random integer number and save it to a file named 'a.txt'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> just tell me if the task is done</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  2. tell me a random joke</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  3. save the previously generated random number to a file named 'b.txt'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> just tell me if the task is done</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">scoring_points</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">score_point</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The two files 'a.txt' and 'b.txt' should contain the same number"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">eval_code</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      content_a = open('a.txt'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> 'r').read().strip()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      content_b = open('b.txt'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> 'r').read().strip()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      assert content_a == content_b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token key atrule">f"content of a.txt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">content_a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token key atrule">content of b.txt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">content_b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We need to evaluate the solution based on the content of the files 'a.txt' and 'b.txt'.
The <code>eval_code</code> field is used to write the evaluation code.
You can treat it as a normal test case in a unit test framework using the <code>assert</code> statement.
The solution get the score point if the <code>assert</code> statement does not raise an exception.</p>
<p>We provide additional fields in the YAML file to specify the evaluation environment.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> the version of the evaluation file</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">config_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> configurations of the agent for this evaluation case</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">app_dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> the working directory of the agent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> list of packages required by the agent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">data_files</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> list of files copied to the working directory</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">max_rounds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> the maximum number of rounds for the conversation</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We have implemented the new evaluation method in TaskWeaver and prepared a set of evaluation cases in the <code>auto_eval/cases</code> directory.
Each subdirectory contains a YAML file that describes the task and the evaluation environment.
To run the evaluation, you can find more details in the
<a href="https://github.com/microsoft/TaskWeaver/blob/main/auto_eval/README.md" target="_blank" rel="noopener noreferrer">auto_eval/README.md</a> file.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-adapt-for-other-agents">How to adapt for other agents?<a href="https://docusaurus.io/TaskWeaver/blog/evaluation#how-to-adapt-for-other-agents" class="hash-link" aria-label="Direct link to How to adapt for other agents?" title="Direct link to How to adapt for other agents?">​</a></h2>
<p>Although the new evaluation method is designed for TaskWeaver, it can be applied to other agents as well,
as long as the agent can be treated as a conversational partner.
More specifically, the agent should be able to instantiate as a Python object with necessary configurations and a working directory
as we did for TaskWeaver in <code>auto_eval/taskweaver_eval.py</code>:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">TaskWeaverVirtualUser</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">VirtualUser</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> task_description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> app_dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> config_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token builtin" style="color:rgb(189, 147, 249)">dict</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token builtin" style="color:rgb(189, 147, 249)">super</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">task_description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">app </span><span class="token operator">=</span><span class="token plain"> TaskWeaverApp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">app_dir</span><span class="token operator">=</span><span class="token plain">app_dir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> config</span><span class="token operator">=</span><span class="token plain">config_var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">session </span><span class="token operator">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">get_session</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">session_id </span><span class="token operator">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">session</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">session_id</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_reply_from_agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        response_round </span><span class="token operator">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">session</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">send_message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            event_handler</span><span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> response_round</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">state </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"failed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Failed to get response from agent."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> response_round</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">post_list</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">message</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">close</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stop</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To add another agent, you need to implement the <code>VirtualUser</code> class and the <code>get_reply_from_agent</code>, <code>close</code> methods.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Roles in TaskWeaver]]></title>
            <link>https://docusaurus.io/TaskWeaver/blog/role</link>
            <guid>https://docusaurus.io/TaskWeaver/blog/role</guid>
            <pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We frame TaskWeaver as a code-first agent framework. The term "code-first" means that the agent is designed to]]></description>
            <content:encoded><![CDATA[<p>We frame TaskWeaver as a <strong>code-first</strong> agent framework. The term "code-first" means that the agent is designed to
convert the user's request into one or multiple runnable code snippets and then execute them to generate the response.
The philosophy behind this design is to consider programming languages as the de facto language for communication in cyber-physical systems,
just like the natural language for human communication. Therefore, TaskWeaver translates the user's request in natural language into
programming languages, which can be executed by the system to perform the desired tasks.</p>
<p>Under this design, when the developer needs to extend the agent's capability, they can write a new plugin.
A plugin is a piece of code wrapped in a class that can be called as a function by the agent in the generated code snippets.
Let's consider an example: <em>the agent is asked to load a CSV file and perform anomaly detection on the data</em>.
The workflow of the agent is in the diagram below. It is very natural to represent data to be processed in variables and this task in code snippets.</p>
<!-- -->
<p>However, we do find challenges for other tasks that are not naturally represented in code snippets.
Let's consider another example: <em>the agent is asked to read a manual and follow the instructions to process the data</em>.
We first assume there is a plugin that can read the manual and extract the instructions, called <code>read_manual</code>.
The workflow of the agent is in the diagram below.
This diagram only shows the first step of the task, which is to read the manual and extract the instructions.
Although it does obtain the instructions, and the agent can follow them to complete the task, the behavior
of the agent is less natural compared to the previous example.</p>
<!-- -->
<p>Why? First, there is no need to generate code to read the manual and extract the instructions.
Once the Planner has decided to read the manual, the code to extract the instructions is straightforward.
Even though that there might be dynamic parts in the code such as some arguments in the function <code>read_manual</code>,
it could be handled by the Planner. Therefore, the Code Generator is not necessary in this case,
and the current flow actually incurred unnecessary LLM call overhead to generate the code snippets.
Second, it does not make sense to represent the instructions in variables.
The instructions are not data to be processed, but a text guide for the agent to follow.</p>
<p>For these reasons, we introduced the concept of <a href="https://docusaurus.io/TaskWeaver/docs/concepts/role">roles</a> in TaskWeaver.
Roles are actually not new in TaskWeaver as there are already roles like <code>Planner</code> and <code>CodeInterpreter</code>.
To add a new role, the developer can follow the documentation <a href="https://docusaurus.io/TaskWeaver/docs/concepts/role">here</a>.
In general, a role is a class that inherits the <code>Role</code> class and implements the <code>reply</code> method.
The <code>reply</code> method is the function that the agent calls to interact with the role, which has the
following signature:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token operator">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> Post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># implementation</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>It takes the <code>memory</code> object, which is the memory of the agent, and returns a <a href="https://docusaurus.io/TaskWeaver/docs/concepts/post">Post</a> object, which is the response of the role to the Planner.
With the <code>memory</code> object, the role can access the history of the conversation and the context of the conversation.
You may have noticed that all roles in TaskWeaver can only talk to the Planner, not to each other.
If a role needs to talk to another role, it should go through the Planner.
This design is to ensure that the Planner can control the conversation and the flow of the conversation.
For a task that requires multiple roles to work together, the Planner can orchestrate the roles to work together to complete the task
as shown in the diagram below.</p>
<!-- -->
<p>The communication between the Planner and the roles is done through the <a href="https://docusaurus.io/TaskWeaver/docs/concepts/post">Post</a> object.
In other words, they talk to each other by sending messages in natural language.
What if a role needs to send some data to another role? If this is the case, we would recommend to implement a new plugin
instead of a new role. Otherwise, you may need to store the data in an external storage like a database and let the other role to access it.</p>
<p>In summary, the concept of roles in TaskWeaver is to provide a way to extend the agent's capability by implementing new roles.
This is especially useful when the task is not naturally represented in code snippets such as acquire text information
from a knowledge base or the internet. Implementing a new role is straightforward by inheriting the <code>Role</code> class and implementing the <code>reply</code> method.
All extra roles should be put in the <code>TaskWeaver/taskweaver/ext_role</code> folder, which will be automatically loaded by TaskWeaver.
We have provided a few sample roles in the <code>TaskWeaver/taskweaver/ext_role</code> folder, such as the <code>Echo</code> role that echoes the user's message back to the user.
More advanced role examples are the Planner and the CodeInterpreter roles, which are the core roles in TaskWeaver.</p>]]></content:encoded>
        </item>
    </channel>
</rss>