<!DOCTYPE html><html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>[2307.07924] Communicative Agents for Software Development</title><meta property="og:description" content="Software engineering is a domain characterized by intricate decision-making processes, often relying on nuanced intuition and consultation. Recent advancements in deep learning have started to revolutionize software en…">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Communicative Agents for Software Development">
<meta name="twitter:image:src" content="https://ar5iv.labs.arxiv.org/assets/ar5iv_card.png">
<meta name="twitter:image:alt" content="ar5iv logo">
<meta property="og:title" content="Communicative Agents for Software Development">
<meta property="og:site_name" content="ar5iv">
<meta property="og:image" content="https://ar5iv.labs.arxiv.org/assets/ar5iv_card.png">
<meta property="og:type" content="article">
<meta property="og:url" content="https://ar5iv.labs.arxiv.org/html/2307.07924">

<!--Generated on Wed Feb 28 17:51:38 2024 by LaTeXML (version 0.8.8) http://dlmf.nist.gov/LaTeXML/.-->
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<script>
  function detectColorScheme(){
    var theme="light";
    var current_theme = localStorage.getItem("ar5iv_theme");
    if(current_theme){
      if(current_theme == "dark"){
        theme = "dark";
      } }
    else if(!window.matchMedia) { return false; }
    else if(window.matchMedia("(prefers-color-scheme: dark)").matches) {
      theme = "dark"; }
    if (theme=="dark") {
      document.documentElement.setAttribute("data-theme", "dark");
    } else {
      document.documentElement.setAttribute("data-theme", "light"); } }

  detectColorScheme();

  function toggleColorScheme(){
    var current_theme = localStorage.getItem("ar5iv_theme");
    if (current_theme) {
      if (current_theme == "light") {
        localStorage.setItem("ar5iv_theme", "dark"); }
      else {
        localStorage.setItem("ar5iv_theme", "light"); } }
    else {
        localStorage.setItem("ar5iv_theme", "dark"); }
    detectColorScheme(); }
</script>
<link media="all" rel="stylesheet" href="/assets/ar5iv-fonts.0.7.9.min.css"><link media="all" rel="stylesheet" href="/assets/ar5iv.0.7.9.min.css"><link media="all" rel="stylesheet" href="/assets/ar5iv-site.0.2.2.css">
</head>
<body>
<div class="ltx_page_main">
<div class="ltx_page_content">
<article class="ltx_document ltx_authors_1line">
<div id="p1" class="ltx_para">
<span id="p1.1" class="ltx_ERROR undefined">\pdfcolInitStack</span>
<p id="p1.2" class="ltx_p">tcb@breakable



































































</p>
</div>
<h1 class="ltx_title ltx_title_document">Communicative Agents for Software Development</h1>
<div class="ltx_authors">
<span class="ltx_creator ltx_role_author">
<span class="ltx_personname">
Chen Qian<sup id="id18.18.id1" class="ltx_sup">♠</sup>  Xin Cong<sup id="id19.19.id2" class="ltx_sup">♠</sup>  Wei Liu<sup id="id20.20.id3" class="ltx_sup">♠</sup>  Cheng Yang<sup id="id21.21.id4" class="ltx_sup">♣</sup>  Weize Chen<sup id="id22.22.id5" class="ltx_sup">♠</sup>  Yusheng Su<sup id="id23.23.id6" class="ltx_sup">♠</sup>  
<br class="ltx_break"><span id="id7.7.1" class="ltx_text ltx_font_bold">Yufan Dang<sup id="id7.7.1.1" class="ltx_sup"><span id="id7.7.1.1.1" class="ltx_text ltx_font_medium">♠</span></sup></span>  <span id="id8.8.2" class="ltx_text ltx_font_bold">Jiahao Li<sup id="id8.8.2.1" class="ltx_sup"><span id="id8.8.2.1.1" class="ltx_text ltx_font_medium">◆</span></sup></span>  <span id="id9.9.3" class="ltx_text ltx_font_bold">Juyuan Xu<sup id="id9.9.3.1" class="ltx_sup"><span id="id9.9.3.1.1" class="ltx_text ltx_font_medium ltx_font_italic">▲</span></sup></span>  <span id="id10.10.4" class="ltx_text ltx_font_bold">Dahai Li<sup id="id10.10.4.1" class="ltx_sup"><span id="id10.10.4.1.1" class="ltx_text ltx_font_medium ltx_font_italic">★</span></sup></span>  <span id="id11.11.5" class="ltx_text ltx_font_bold">Zhiyuan Liu<sup id="id11.11.5.1" class="ltx_sup"><span id="id11.11.5.1.1" class="ltx_text ltx_font_medium ltx_font_italic">♠</span></sup><sup id="id11.11.5.2" class="ltx_sup"><span id="id11.11.5.2.1" class="ltx_text ltx_font_medium">🖂</span></sup></span>  <span id="id12.12.6" class="ltx_text ltx_font_bold">Maosong Sun<sup id="id12.12.6.1" class="ltx_sup"><span id="id12.12.6.1.1" class="ltx_text ltx_font_medium ltx_font_italic">♠</span></sup><sup id="id12.12.6.2" class="ltx_sup"><span id="id12.12.6.2.1" class="ltx_text ltx_font_medium">🖂</span></sup></span> 
<br class="ltx_break"><sup id="id24.24.id7" class="ltx_sup">♠</sup>Tsinghua University  <sup id="id25.25.id8" class="ltx_sup">♣</sup>Beijing University of Posts and Telecommunications  
<br class="ltx_break"><sup id="id26.26.id9" class="ltx_sup"><span id="id26.26.id9.1" class="ltx_text ltx_font_italic">◆</span></sup>Dalian University of Technology  <sup id="id27.27.id10" class="ltx_sup">▲</sup>Brown University  <sup id="id28.28.id11" class="ltx_sup">★</sup>Modelbest Inc.
<br class="ltx_break"><span id="id29.29.id12" class="ltx_text ltx_font_typewriter">qianc62@gmail.com</span>  <span id="id30.30.id13" class="ltx_text ltx_font_typewriter">liuzy@tsinghua.edu.cn</span>  <span id="id31.31.id14" class="ltx_text ltx_font_typewriter">sms@tsinghua.edu.cn</span>
</span></span>
</div>

<div class="ltx_abstract">
<h6 class="ltx_title ltx_title_abstract">Abstract</h6>
<p id="id32.id1" class="ltx_p">Software engineering is a domain characterized by intricate decision-making processes, often relying on nuanced intuition and consultation. Recent advancements in deep learning have started to revolutionize software engineering practices through elaborate designs implemented at various stages of software development. In this paper, we present an innovative paradigm that leverages large language models (LLMs) throughout the entire software development process, streamlining and unifying key processes through natural language communication, thereby eliminating the need for specialized models at each phase.
At the core of this paradigm lies ChatDev, a virtual chat-powered software development company that mirrors the established waterfall model, meticulously dividing the development process into four distinct chronological stages: designing, coding, testing, and documenting. Each stage engages a team of "software agents", such as programmers, code reviewers, and test engineers, fostering collaborative dialogue and facilitating a seamless workflow. The chat chain acts as a facilitator, breaking down each stage into atomic subtasks. This enables dual roles, allowing for proposing and validating solutions through context-aware communication, leading to efficient resolution of specific subtasks.
The instrumental analysis of ChatDev highlights its remarkable efficacy in software generation, enabling the completion of the entire software development process in under seven minutes at a cost of less than one dollar. It not only identifies and alleviates potential vulnerabilities but also rectifies potential hallucinations while maintaining commendable efficiency and cost-effectiveness. The potential of ChatDev unveils fresh possibilities for integrating LLMs into the realm of software development. Our code is available at <a target="_blank" href="https://github.com/OpenBMB/ChatDev" title="" class="ltx_ref ltx_url ltx_font_typewriter">https://github.com/OpenBMB/ChatDev</a>.</p>
</div>
<span id="footnotex1" class="ltx_note ltx_role_footnotetext"><sup class="ltx_note_mark">†</sup><span class="ltx_note_outer"><span class="ltx_note_content"><sup class="ltx_note_mark">†</sup><span class="ltx_note_type">footnotetext: </span>🖂: Corresponding Authors.</span></span></span>
<figure id="S0.F1" class="ltx_figure"><img src="/html/2307.07924/assets/figures/company.png" id="S0.F1.g1" class="ltx_graphics ltx_centering ltx_img_square" width="592" height="528" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 1: </span>ChatDev, our virtual <span id="S0.F1.5.1" class="ltx_text ltx_ulem_uwave">chat</span>-powered company for software <span id="S0.F1.6.2" class="ltx_text ltx_ulem_uwave">dev</span>elopment, brings together "software agents" from diverse social identities, including chief officers, professional programmers, test engineers, and art designers. When presented with a preliminary task by a human “client” (<span id="S0.F1.7.3" class="ltx_text ltx_font_italic">e.g., </span>“<span id="S0.F1.8.4" class="ltx_text ltx_font_italic">develop a gomoku game</span>”), the software agents at ChatDev engage in effective communication and mutual verification through collaborative chatting. This process enables them to automatically craft comprehensive software solutions that encompass source codes, environment dependencies, and user manuals.</figcaption>
</figure>
<div class="ltx_pagination ltx_role_newpage"></div>
<section id="S1" class="ltx_section">
<h2 class="ltx_title ltx_title_section">
<span class="ltx_tag ltx_tag_section">1 </span>Introduction</h2>

<div id="S1.p1" class="ltx_para ltx_noindent">
<blockquote id="S1.p1.1" class="ltx_quote">
<p id="S1.p1.1.1" class="ltx_p ltx_align_center">“<span id="S1.p1.1.1.1" class="ltx_text ltx_font_italic">Collaboration allows us to know more than we are capable of knowing by ourselves. It empowers us to think differently, access information we wouldn’t 
<br class="ltx_break">have otherwise, and combine ideas as we work together towards a shared goal.</span>”</p>
<p id="S1.p1.1.2" class="ltx_p ltx_align_right">—–Paul Solarz</p>
</blockquote>
</div>
<div id="S1.p2" class="ltx_para ltx_noindent">
<p id="S1.p2.1" class="ltx_p">Software engineering entails a methodical and disciplined approach to the development, operation, and maintenance of software systems <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib4" title="" class="ltx_ref">4</a>]</cite>. However, the complexity of software intelligence often leads to decisions based on intuition and limited consultation with senior developers <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib14" title="" class="ltx_ref">14</a>]</cite>.
Recent advancements in deep learning techniques have prompted researchers to explore their application in software engineering, aiming to improve effectiveness, efficiency, and cost reduction .
Prior studies in deep learning-based software engineering have addressed various tasks, categorized as software requirements, design, implementation, testing, and maintenance <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib34" title="" class="ltx_ref">34</a>; <a href="#bib.bib29" title="" class="ltx_ref">29</a>]</cite>.
The software development process involves multiple roles, including organizational coordination, task allocation, code writing, system testing, and documentation preparation. It is a highly complex and intricate activity that demands meticulous attention to detail due to its long development cycles <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib17" title="" class="ltx_ref">17</a>; <a href="#bib.bib4" title="" class="ltx_ref">4</a>]</cite>.</p>
</div>
<div id="S1.p3" class="ltx_para ltx_noindent">
<p id="S1.p3.1" class="ltx_p">In recent years, <span id="S1.p3.1.1" class="ltx_text ltx_framed ltx_framed_underline">l</span>arge <span id="S1.p3.1.2" class="ltx_text ltx_framed ltx_framed_underline">l</span>anguage <span id="S1.p3.1.3" class="ltx_text ltx_framed ltx_framed_underline">m</span>odels (LLMs) have achieved significant milestones in the field of <span id="S1.p3.1.4" class="ltx_text ltx_framed ltx_framed_underline">n</span>atural <span id="S1.p3.1.5" class="ltx_text ltx_framed ltx_framed_underline">l</span>anguage <span id="S1.p3.1.6" class="ltx_text ltx_framed ltx_framed_underline">p</span>rocessing (NLP) <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib5" title="" class="ltx_ref">5</a>]</cite> and computer vision (CV) <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib35" title="" class="ltx_ref">35</a>]</cite>. After training on massive corpora using the “next word prediction” paradigm, LLMs have demonstrated impressive performance on a wide range of downstream tasks, such as context-aware question answering, machine translation, and code generation.
In fact, the core elements involved in software development, namely codes and documents, can both be regarded as “language” (<span id="S1.p3.1.7" class="ltx_text ltx_font_italic">i.e., </span>sequences of characters) <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib7" title="" class="ltx_ref">7</a>]</cite>. From this perspective, this paper explores an end-to-end software development framework driven by LLMs, encompassing requirements analysis, code development, system testing, and document generation, aiming to provide a unified, efficient, and cost-effective paradigm for software development.</p>
</div>
<div id="S1.p4" class="ltx_para ltx_noindent">
<p id="S1.p4.1" class="ltx_p">Directly generating an entire software system using LLMs can result in code hallucinations to a certain extent, similar to the phenomenon of hallucination in natural language knowledge querying <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib2" title="" class="ltx_ref">2</a>]</cite>. These hallucinations include incomplete implementation of functions, missing dependencies, and potential undiscovered bugs. Code hallucinations arise primarily due to two reasons. Firstly, the lack of task specificity confuses LLMs when generating a software system in one step. Granular tasks in software development, such as analyzing user/client requirements and selecting programming languages, provide guided thinking that is absent in the high-level nature of the task handled by LLMs. Secondly, the absence of cross-examination in decision-making poses significant risks <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib9" title="" class="ltx_ref">9</a>]</cite>.
Individual model instances propose a diverse range of answers, throwing the requirements to debate or examine the responses from other model instances to converge on a single and more accurate common answer <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib12" title="" class="ltx_ref">12</a>]</cite>, such as code peer-review and suggestion feedbacks.</p>
</div>
<div id="S1.p5" class="ltx_para ltx_noindent">
<p id="S1.p5.1" class="ltx_p">To address the aforementioned challenges, we “establish” a virtual <span id="S1.p5.1.1" class="ltx_text ltx_ulem_uwave">chat</span>-powered software <span id="S1.p5.1.2" class="ltx_text ltx_ulem_uwave">tech</span>nology company – ChatDev. It follows the classic waterfall model <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib3" title="" class="ltx_ref">3</a>]</cite> and divides the process into four phases: designing, coding, testing, and documenting. At each phase, ChatDev recruits multiple "software agents" with different roles, such as programmers, reviewers, and testers. To facilitate effective communication and collaboration, ChatDev utilizes a proposed chat chain that divides each phase into atomic subtasks. Within the chat chain, each node represents a specific subtask, and two roles engage in context-aware, multi-turn discussions to propose and validate solutions. This approach ensures that client requirements are analyzed, creative ideas are generated, prototype systems are designed and implemented, potential issues are identified and addressed, debug information is explained, appealing graphics are created, and user manuals are generated. By guiding the software development process along the chat chain, ChatDev delivers the final software to the user, including source code, dependency environment specifications, and user manuals.</p>
</div>
<div id="S1.p6" class="ltx_para ltx_noindent">
<p id="S1.p6.1" class="ltx_p">The experiment analyzed all the software produced by ChatDev in response to 70 user requirements. On average, ChatDev generated 17.04 files per software, alleviated potential code vulnerabilities caused by code hallucinations 13.23 times, had a software production time of 409.84 seconds, and incurred a manufacturing cost of $0.2967. Discussions between a reviewer and a programmer led to the identification and modification of nearly twenty types of code vulnerabilities, while discussions between a tester and a programmer resulted in the identification and resolution of more than ten types of potential bugs.
In summary, our main contributions are as follows:</p>
<ol id="S1.I1" class="ltx_enumerate">
<li id="S1.I1.i1" class="ltx_item" style="list-style-type:none;">
<span class="ltx_tag ltx_tag_item"><math id="S1.I1.i1.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="S1.I1.i1.1.1.m1.1b"><mo id="S1.I1.i1.1.1.m1.1.1" xref="S1.I1.i1.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="S1.I1.i1.1.1.m1.1c"><ci id="S1.I1.i1.1.1.m1.1.1.cmml" xref="S1.I1.i1.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="S1.I1.i1.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<div id="S1.I1.i1.p1" class="ltx_para">
<p id="S1.I1.i1.p1.1" class="ltx_p">We propose ChatDev, a chat-based software development framework. By merely specifying a task, ChatDev sequentially handles designing, coding, testing, and documenting. This new paradigm simplifies software development by unifying main processes through language communication, eliminating the need for specialized models at each phase.</p>
</div>
</li>
<li id="S1.I1.i2" class="ltx_item" style="list-style-type:none;">
<span class="ltx_tag ltx_tag_item"><math id="S1.I1.i2.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="S1.I1.i2.1.1.m1.1b"><mo id="S1.I1.i2.1.1.m1.1.1" xref="S1.I1.i2.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="S1.I1.i2.1.1.m1.1c"><ci id="S1.I1.i2.1.1.m1.1.1.cmml" xref="S1.I1.i2.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="S1.I1.i2.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<div id="S1.I1.i2.p1" class="ltx_para">
<p id="S1.I1.i2.p1.1" class="ltx_p">We propose the <span id="S1.I1.i2.p1.1.1" class="ltx_text ltx_font_italic">chat chain</span> to decompose the development process into sequential atomic subtasks. Each subtask requires collaborative interaction and cross-examination between two roles. This framework enables multi-agent collaboration, user inspection of intermediate outputs, error diagnoses, and reasoning intervention. It ensures a granular focus on specific subtasks within each chat, facilitating effective collaboration and promoting the achievement of desired outputs.</p>
</div>
</li>
<li id="S1.I1.i3" class="ltx_item" style="list-style-type:none;">
<span class="ltx_tag ltx_tag_item"><math id="S1.I1.i3.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="S1.I1.i3.1.1.m1.1b"><mo id="S1.I1.i3.1.1.m1.1.1" xref="S1.I1.i3.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="S1.I1.i3.1.1.m1.1c"><ci id="S1.I1.i3.1.1.m1.1.1.cmml" xref="S1.I1.i3.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="S1.I1.i3.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<div id="S1.I1.i3.p1" class="ltx_para">
<p id="S1.I1.i3.p1.1" class="ltx_p">To further alleviate potential challenges related to code hallucinations, we introduce the thought instruction mechanism in each independent chat process during code completion, reviewing, and testing. By performing a “role flip”, an instructor explicitly injects specific thoughts for code modifications into instructions, thereby guiding the assistant programmer more precisely.</p>
</div>
</li>
<li id="S1.I1.i4" class="ltx_item" style="list-style-type:none;">
<span class="ltx_tag ltx_tag_item"><math id="S1.I1.i4.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="S1.I1.i4.1.1.m1.1b"><mo id="S1.I1.i4.1.1.m1.1.1" xref="S1.I1.i4.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="S1.I1.i4.1.1.m1.1c"><ci id="S1.I1.i4.1.1.m1.1.1.cmml" xref="S1.I1.i4.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="S1.I1.i4.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<div id="S1.I1.i4.p1" class="ltx_para ltx_noindent">
<p id="S1.I1.i4.p1.1" class="ltx_p">The experiments demonstrate the efficiency and cost-effectiveness of ChatDev’s automated software development process. Through effective communication, proposal, and mutual examination between roles in each chat, the framework enables effective decision-making.</p>
</div>
</li>
</ol>
</div>
</section>
<section id="S2" class="ltx_section">
<h2 class="ltx_title ltx_title_section">
<span class="ltx_tag ltx_tag_section">2 </span>ChatDev</h2>

<div id="S2.p1" class="ltx_para ltx_noindent">
<p id="S2.p1.1" class="ltx_p">Similar to hallucinations encountered when using LLMs for natural language querying <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib2" title="" class="ltx_ref">2</a>]</cite>, directly generating entire software systems using LLMs can result in severe code hallucinations, such as incomplete implementation, missing dependencies, and undiscovered bugs.
These hallucinations may stem from the lack of specificity in the task and the absence of cross-examination in decision-making.
To address these limitations, as Figure <a href="#S0.F1" title="Figure 1 ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">1</span></a> shows, we establish a virtual <span id="S2.p1.1.1" class="ltx_text ltx_ulem_uwave">chat</span>-powered software <span id="S2.p1.1.2" class="ltx_text ltx_ulem_uwave">tech</span>nology company – ChatDev, which comprises of recruited agents from diverse social identities, such as chief officers, professional programmers, test engineers, and art designers.
When presented with a task, the diverse agents at ChatDev collaborate to develop a required software, including an executable system, environmental guidelines, and user manuals.
This paradigm revolves around leveraging large language models as the core thinking component, enabling the agents to simulate the entire software development process, circumventing the need for additional model training and mitigating undesirable code hallucinations to some extent.</p>
</div>
<section id="S2.SS1" class="ltx_subsection">
<h3 class="ltx_title ltx_title_subsection">
<span class="ltx_tag ltx_tag_subsection">2.1 </span>Chat Chain</h3>

<div id="S2.SS1.p1" class="ltx_para ltx_noindent">
<p id="S2.SS1.p1.1" class="ltx_p">ChatDev employs the widely adopted waterfall model, a prominent software development life cycle model, to divide the software development process into four distinct phases: <span id="S2.SS1.p1.1.1" class="ltx_text ltx_font_italic">designing</span>, <span id="S2.SS1.p1.1.2" class="ltx_text ltx_font_italic">coding</span>, <span id="S2.SS1.p1.1.3" class="ltx_text ltx_font_italic">testing</span>, and <span id="S2.SS1.p1.1.4" class="ltx_text ltx_font_italic">documenting</span>.
In the designing phase, innovative ideas are generated through collaborative brainstorming, and technical design requirements are defined. The coding phase involves the development and review of source code, while the testing phase integrates all components into a system and utilizes feedback messages from interpreter for debugging. The documenting phase encompasses the generation of environment specifications and user manuals.
Each of these phases necessitates effective communication among multiple roles, posing challenges in determining the sequence of interactions and identifying the relevant individuals to engage with.</p>
</div>
<div id="S2.SS1.p2" class="ltx_para ltx_noindent">
<p id="S2.SS1.p2.1" class="ltx_p">To address this, we propose a generalized architecture by breaking down each phase into multiple atomic chats, each with a specific focus on task-oriented role-playing involving two distinct roles.
Through the exchange of instructions and collaboration between the participating agents, the desired output for each chat, which forms a vital component of the target software, is achieved. An illustration of this process is depicted in Figure <a href="#S2.F2" title="Figure 2 ‣ 2.1 Chat Chain ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">2</span></a>, where a sequence of intermediate task-solving chats, referred to as a “chat chain”, is presented. In each chat, an instructor initiates instructions, guiding the dialogue towards task completion, while the assistant follows the instructions, provides suitable solutions, and engages in discussions regarding feasibility. The instructor and assistant cooperate through multi-turn dialogues until they reach a consensus and determine that the task has been successfully accomplished.</p>
</div>
<div id="S2.SS1.p3" class="ltx_para ltx_noindent">
<p id="S2.SS1.p3.1" class="ltx_p">The chat chain provides a transparent view of the software development process, shedding light on the decision-making path and offering opportunities for debugging when errors arise, which enables users to inspect intermediate outputs, diagnose errors, and intervene in the reasoning process if necessary.
Besides, chat chain ensures a granular focus on specific subtasks within each phase, facilitating effective collaboration and promoting the attainment of desired outputs.</p>
</div>
<figure id="S2.F2" class="ltx_figure"><img src="/html/2307.07924/assets/figures/chat_chain.png" id="S2.F2.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="592" height="197" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 2: </span>The proposed architecture of ChatDev consists of phase-level and chat-level components. At the phase level, the waterfall model is used to break down the software development process into four sequential phases. At the chat level, each phase is further divided into atomic chats. These atomic chats involve task-oriented role-playing between two agents, promoting collaborative communication. The communication follows an instruction-following style, where agents interact to accomplish a specific subtask within each chat.</figcaption>
</figure>
</section>
<section id="S2.SS2" class="ltx_subsection">
<h3 class="ltx_title ltx_title_subsection">
<span class="ltx_tag ltx_tag_subsection">2.2 </span>Designing</h3>

<div id="S2.SS2.p1" class="ltx_para ltx_noindent">
<p id="S2.SS2.p1.1" class="ltx_p">In the designing phase, ChatDev receives an initial idea from a human client.
This phase involves three predefined roles: CEO (chief executive officer), CPO (chief product officer), and CTO (chief technology officer). The chat chain then breaks down the designing phase into sequential atomic chatting tasks, including decisions regarding the target software’s modality (CEO and CPO) and the programming language (CEO and CTO).</p>
</div>
<div id="S2.SS2.p2" class="ltx_para ltx_noindent">
<p id="S2.SS2.p2.6" class="ltx_p"><span id="S2.SS2.p2.6.1" class="ltx_text ltx_font_bold">Role Assignment</span>  System prompts/messages are used to assign roles to each agent during the role-playing process.
In contrast to other conversational language models, our approach to prompt engineering is restricted solely to the initiation of role-playing scenarios.
The instructor is denoted as <math id="S2.SS2.p2.1.m1.1" class="ltx_Math" alttext="\mathcal{P}_{\mathcal{I}}" display="inline"><semantics id="S2.SS2.p2.1.m1.1a"><msub id="S2.SS2.p2.1.m1.1.1" xref="S2.SS2.p2.1.m1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.1.m1.1.1.2" xref="S2.SS2.p2.1.m1.1.1.2.cmml">𝒫</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.1.m1.1.1.3" xref="S2.SS2.p2.1.m1.1.1.3.cmml">ℐ</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p2.1.m1.1b"><apply id="S2.SS2.p2.1.m1.1.1.cmml" xref="S2.SS2.p2.1.m1.1.1"><csymbol cd="ambiguous" id="S2.SS2.p2.1.m1.1.1.1.cmml" xref="S2.SS2.p2.1.m1.1.1">subscript</csymbol><ci id="S2.SS2.p2.1.m1.1.1.2.cmml" xref="S2.SS2.p2.1.m1.1.1.2">𝒫</ci><ci id="S2.SS2.p2.1.m1.1.1.3.cmml" xref="S2.SS2.p2.1.m1.1.1.3">ℐ</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p2.1.m1.1c">\mathcal{P}_{\mathcal{I}}</annotation></semantics></math>, while the assistant’s system prompt/message is denoted as <math id="S2.SS2.p2.2.m2.1" class="ltx_Math" alttext="\mathcal{P}_{\mathcal{A}}" display="inline"><semantics id="S2.SS2.p2.2.m2.1a"><msub id="S2.SS2.p2.2.m2.1.1" xref="S2.SS2.p2.2.m2.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.2.m2.1.1.2" xref="S2.SS2.p2.2.m2.1.1.2.cmml">𝒫</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.2.m2.1.1.3" xref="S2.SS2.p2.2.m2.1.1.3.cmml">𝒜</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p2.2.m2.1b"><apply id="S2.SS2.p2.2.m2.1.1.cmml" xref="S2.SS2.p2.2.m2.1.1"><csymbol cd="ambiguous" id="S2.SS2.p2.2.m2.1.1.1.cmml" xref="S2.SS2.p2.2.m2.1.1">subscript</csymbol><ci id="S2.SS2.p2.2.m2.1.1.2.cmml" xref="S2.SS2.p2.2.m2.1.1.2">𝒫</ci><ci id="S2.SS2.p2.2.m2.1.1.3.cmml" xref="S2.SS2.p2.2.m2.1.1.3">𝒜</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p2.2.m2.1c">\mathcal{P}_{\mathcal{A}}</annotation></semantics></math>. These prompts assign roles to the agents before the dialogues begin.
Let <math id="S2.SS2.p2.3.m3.1" class="ltx_Math" alttext="\mathcal{L}_{\mathcal{I}}" display="inline"><semantics id="S2.SS2.p2.3.m3.1a"><msub id="S2.SS2.p2.3.m3.1.1" xref="S2.SS2.p2.3.m3.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.3.m3.1.1.2" xref="S2.SS2.p2.3.m3.1.1.2.cmml">ℒ</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.3.m3.1.1.3" xref="S2.SS2.p2.3.m3.1.1.3.cmml">ℐ</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p2.3.m3.1b"><apply id="S2.SS2.p2.3.m3.1.1.cmml" xref="S2.SS2.p2.3.m3.1.1"><csymbol cd="ambiguous" id="S2.SS2.p2.3.m3.1.1.1.cmml" xref="S2.SS2.p2.3.m3.1.1">subscript</csymbol><ci id="S2.SS2.p2.3.m3.1.1.2.cmml" xref="S2.SS2.p2.3.m3.1.1.2">ℒ</ci><ci id="S2.SS2.p2.3.m3.1.1.3.cmml" xref="S2.SS2.p2.3.m3.1.1.3">ℐ</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p2.3.m3.1c">\mathcal{L}_{\mathcal{I}}</annotation></semantics></math> and <math id="S2.SS2.p2.4.m4.1" class="ltx_Math" alttext="\mathcal{L}_{\mathcal{A}}" display="inline"><semantics id="S2.SS2.p2.4.m4.1a"><msub id="S2.SS2.p2.4.m4.1.1" xref="S2.SS2.p2.4.m4.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.4.m4.1.1.2" xref="S2.SS2.p2.4.m4.1.1.2.cmml">ℒ</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.4.m4.1.1.3" xref="S2.SS2.p2.4.m4.1.1.3.cmml">𝒜</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p2.4.m4.1b"><apply id="S2.SS2.p2.4.m4.1.1.cmml" xref="S2.SS2.p2.4.m4.1.1"><csymbol cd="ambiguous" id="S2.SS2.p2.4.m4.1.1.1.cmml" xref="S2.SS2.p2.4.m4.1.1">subscript</csymbol><ci id="S2.SS2.p2.4.m4.1.1.2.cmml" xref="S2.SS2.p2.4.m4.1.1.2">ℒ</ci><ci id="S2.SS2.p2.4.m4.1.1.3.cmml" xref="S2.SS2.p2.4.m4.1.1.3">𝒜</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p2.4.m4.1c">\mathcal{L}_{\mathcal{A}}</annotation></semantics></math> represent two large language models.
Using the system message, we have <math id="S2.SS2.p2.5.m5.1" class="ltx_Math" alttext="\mathcal{I}\leftarrow\mathcal{L}_{\mathcal{I}}^{\mathcal{P}_{\mathcal{I}}}" display="inline"><semantics id="S2.SS2.p2.5.m5.1a"><mrow id="S2.SS2.p2.5.m5.1.1" xref="S2.SS2.p2.5.m5.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.5.m5.1.1.2" xref="S2.SS2.p2.5.m5.1.1.2.cmml">ℐ</mi><mo stretchy="false" id="S2.SS2.p2.5.m5.1.1.1" xref="S2.SS2.p2.5.m5.1.1.1.cmml">←</mo><msubsup id="S2.SS2.p2.5.m5.1.1.3" xref="S2.SS2.p2.5.m5.1.1.3.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.5.m5.1.1.3.2.2" xref="S2.SS2.p2.5.m5.1.1.3.2.2.cmml">ℒ</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.5.m5.1.1.3.2.3" xref="S2.SS2.p2.5.m5.1.1.3.2.3.cmml">ℐ</mi><msub id="S2.SS2.p2.5.m5.1.1.3.3" xref="S2.SS2.p2.5.m5.1.1.3.3.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.5.m5.1.1.3.3.2" xref="S2.SS2.p2.5.m5.1.1.3.3.2.cmml">𝒫</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.5.m5.1.1.3.3.3" xref="S2.SS2.p2.5.m5.1.1.3.3.3.cmml">ℐ</mi></msub></msubsup></mrow><annotation-xml encoding="MathML-Content" id="S2.SS2.p2.5.m5.1b"><apply id="S2.SS2.p2.5.m5.1.1.cmml" xref="S2.SS2.p2.5.m5.1.1"><ci id="S2.SS2.p2.5.m5.1.1.1.cmml" xref="S2.SS2.p2.5.m5.1.1.1">←</ci><ci id="S2.SS2.p2.5.m5.1.1.2.cmml" xref="S2.SS2.p2.5.m5.1.1.2">ℐ</ci><apply id="S2.SS2.p2.5.m5.1.1.3.cmml" xref="S2.SS2.p2.5.m5.1.1.3"><csymbol cd="ambiguous" id="S2.SS2.p2.5.m5.1.1.3.1.cmml" xref="S2.SS2.p2.5.m5.1.1.3">superscript</csymbol><apply id="S2.SS2.p2.5.m5.1.1.3.2.cmml" xref="S2.SS2.p2.5.m5.1.1.3"><csymbol cd="ambiguous" id="S2.SS2.p2.5.m5.1.1.3.2.1.cmml" xref="S2.SS2.p2.5.m5.1.1.3">subscript</csymbol><ci id="S2.SS2.p2.5.m5.1.1.3.2.2.cmml" xref="S2.SS2.p2.5.m5.1.1.3.2.2">ℒ</ci><ci id="S2.SS2.p2.5.m5.1.1.3.2.3.cmml" xref="S2.SS2.p2.5.m5.1.1.3.2.3">ℐ</ci></apply><apply id="S2.SS2.p2.5.m5.1.1.3.3.cmml" xref="S2.SS2.p2.5.m5.1.1.3.3"><csymbol cd="ambiguous" id="S2.SS2.p2.5.m5.1.1.3.3.1.cmml" xref="S2.SS2.p2.5.m5.1.1.3.3">subscript</csymbol><ci id="S2.SS2.p2.5.m5.1.1.3.3.2.cmml" xref="S2.SS2.p2.5.m5.1.1.3.3.2">𝒫</ci><ci id="S2.SS2.p2.5.m5.1.1.3.3.3.cmml" xref="S2.SS2.p2.5.m5.1.1.3.3.3">ℐ</ci></apply></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p2.5.m5.1c">\mathcal{I}\leftarrow\mathcal{L}_{\mathcal{I}}^{\mathcal{P}_{\mathcal{I}}}</annotation></semantics></math> and <math id="S2.SS2.p2.6.m6.1" class="ltx_Math" alttext="\mathcal{A}\leftarrow\mathcal{L}_{\mathcal{A}}^{\mathcal{P}_{\mathcal{A}}}" display="inline"><semantics id="S2.SS2.p2.6.m6.1a"><mrow id="S2.SS2.p2.6.m6.1.1" xref="S2.SS2.p2.6.m6.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.6.m6.1.1.2" xref="S2.SS2.p2.6.m6.1.1.2.cmml">𝒜</mi><mo stretchy="false" id="S2.SS2.p2.6.m6.1.1.1" xref="S2.SS2.p2.6.m6.1.1.1.cmml">←</mo><msubsup id="S2.SS2.p2.6.m6.1.1.3" xref="S2.SS2.p2.6.m6.1.1.3.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.6.m6.1.1.3.2.2" xref="S2.SS2.p2.6.m6.1.1.3.2.2.cmml">ℒ</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.6.m6.1.1.3.2.3" xref="S2.SS2.p2.6.m6.1.1.3.2.3.cmml">𝒜</mi><msub id="S2.SS2.p2.6.m6.1.1.3.3" xref="S2.SS2.p2.6.m6.1.1.3.3.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.6.m6.1.1.3.3.2" xref="S2.SS2.p2.6.m6.1.1.3.3.2.cmml">𝒫</mi><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p2.6.m6.1.1.3.3.3" xref="S2.SS2.p2.6.m6.1.1.3.3.3.cmml">𝒜</mi></msub></msubsup></mrow><annotation-xml encoding="MathML-Content" id="S2.SS2.p2.6.m6.1b"><apply id="S2.SS2.p2.6.m6.1.1.cmml" xref="S2.SS2.p2.6.m6.1.1"><ci id="S2.SS2.p2.6.m6.1.1.1.cmml" xref="S2.SS2.p2.6.m6.1.1.1">←</ci><ci id="S2.SS2.p2.6.m6.1.1.2.cmml" xref="S2.SS2.p2.6.m6.1.1.2">𝒜</ci><apply id="S2.SS2.p2.6.m6.1.1.3.cmml" xref="S2.SS2.p2.6.m6.1.1.3"><csymbol cd="ambiguous" id="S2.SS2.p2.6.m6.1.1.3.1.cmml" xref="S2.SS2.p2.6.m6.1.1.3">superscript</csymbol><apply id="S2.SS2.p2.6.m6.1.1.3.2.cmml" xref="S2.SS2.p2.6.m6.1.1.3"><csymbol cd="ambiguous" id="S2.SS2.p2.6.m6.1.1.3.2.1.cmml" xref="S2.SS2.p2.6.m6.1.1.3">subscript</csymbol><ci id="S2.SS2.p2.6.m6.1.1.3.2.2.cmml" xref="S2.SS2.p2.6.m6.1.1.3.2.2">ℒ</ci><ci id="S2.SS2.p2.6.m6.1.1.3.2.3.cmml" xref="S2.SS2.p2.6.m6.1.1.3.2.3">𝒜</ci></apply><apply id="S2.SS2.p2.6.m6.1.1.3.3.cmml" xref="S2.SS2.p2.6.m6.1.1.3.3"><csymbol cd="ambiguous" id="S2.SS2.p2.6.m6.1.1.3.3.1.cmml" xref="S2.SS2.p2.6.m6.1.1.3.3">subscript</csymbol><ci id="S2.SS2.p2.6.m6.1.1.3.3.2.cmml" xref="S2.SS2.p2.6.m6.1.1.3.3.2">𝒫</ci><ci id="S2.SS2.p2.6.m6.1.1.3.3.3.cmml" xref="S2.SS2.p2.6.m6.1.1.3.3.3">𝒜</ci></apply></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p2.6.m6.1c">\mathcal{A}\leftarrow\mathcal{L}_{\mathcal{A}}^{\mathcal{P}_{\mathcal{A}}}</annotation></semantics></math>, which serve as the instructor and assistant agents (Figure <a href="#S2.F3.sf1" title="In Figure 3 ‣ 2.2 Designing ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">3(a)</span></a>), respectively.
In our framework, the instructor initially acts as a CEO, engaging in interactive planning, while the assistant assumes the role of CPO, executing tasks and providing responses.
To achieve role specialization, we employ <span id="S2.SS2.p2.6.2" class="ltx_text ltx_font_italic">inception prompting</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib23" title="" class="ltx_ref">23</a>]</cite>, which has proven effective in enabling agents to fulfill their roles.
The instructor and assistant prompts encompass vital details concerning the designated task and roles, communication protocols, termination criteria, and constraints aimed at preventing undesirable behaviors (<span id="S2.SS2.p2.6.3" class="ltx_text ltx_font_italic">e.g., </span>instruction redundancy, uninformative responses, infinite loops, etc.).</p>
</div>
<div id="S2.SS2.p3" class="ltx_para ltx_noindent">
<p id="S2.SS2.p3.5" class="ltx_p"><span id="S2.SS2.p3.5.1" class="ltx_text ltx_font_bold">Memory Stream</span>  The memory stream <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib32" title="" class="ltx_ref">32</a>]</cite> is a mechanism that maintains a comprehensive record of an agent’s previous dialogues, assisting in subsequent decision-making in an utterance-aware manner.
Formally, the instructor’s message at time <math id="S2.SS2.p3.1.m1.1" class="ltx_Math" alttext="t" display="inline"><semantics id="S2.SS2.p3.1.m1.1a"><mi id="S2.SS2.p3.1.m1.1.1" xref="S2.SS2.p3.1.m1.1.1.cmml">t</mi><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.1.m1.1b"><ci id="S2.SS2.p3.1.m1.1.1.cmml" xref="S2.SS2.p3.1.m1.1.1">𝑡</ci></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.1.m1.1c">t</annotation></semantics></math> is denoted as <math id="S2.SS2.p3.2.m2.1" class="ltx_Math" alttext="\mathcal{I}_{t}" display="inline"><semantics id="S2.SS2.p3.2.m2.1a"><msub id="S2.SS2.p3.2.m2.1.1" xref="S2.SS2.p3.2.m2.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p3.2.m2.1.1.2" xref="S2.SS2.p3.2.m2.1.1.2.cmml">ℐ</mi><mi id="S2.SS2.p3.2.m2.1.1.3" xref="S2.SS2.p3.2.m2.1.1.3.cmml">t</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.2.m2.1b"><apply id="S2.SS2.p3.2.m2.1.1.cmml" xref="S2.SS2.p3.2.m2.1.1"><csymbol cd="ambiguous" id="S2.SS2.p3.2.m2.1.1.1.cmml" xref="S2.SS2.p3.2.m2.1.1">subscript</csymbol><ci id="S2.SS2.p3.2.m2.1.1.2.cmml" xref="S2.SS2.p3.2.m2.1.1.2">ℐ</ci><ci id="S2.SS2.p3.2.m2.1.1.3.cmml" xref="S2.SS2.p3.2.m2.1.1.3">𝑡</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.2.m2.1c">\mathcal{I}_{t}</annotation></semantics></math>, the assistant’s message as <math id="S2.SS2.p3.3.m3.1" class="ltx_Math" alttext="\mathcal{A}_{t}" display="inline"><semantics id="S2.SS2.p3.3.m3.1a"><msub id="S2.SS2.p3.3.m3.1.1" xref="S2.SS2.p3.3.m3.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p3.3.m3.1.1.2" xref="S2.SS2.p3.3.m3.1.1.2.cmml">𝒜</mi><mi id="S2.SS2.p3.3.m3.1.1.3" xref="S2.SS2.p3.3.m3.1.1.3.cmml">t</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.3.m3.1b"><apply id="S2.SS2.p3.3.m3.1.1.cmml" xref="S2.SS2.p3.3.m3.1.1"><csymbol cd="ambiguous" id="S2.SS2.p3.3.m3.1.1.1.cmml" xref="S2.SS2.p3.3.m3.1.1">subscript</csymbol><ci id="S2.SS2.p3.3.m3.1.1.2.cmml" xref="S2.SS2.p3.3.m3.1.1.2">𝒜</ci><ci id="S2.SS2.p3.3.m3.1.1.3.cmml" xref="S2.SS2.p3.3.m3.1.1.3">𝑡</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.3.m3.1c">\mathcal{A}_{t}</annotation></semantics></math>, and the related decisions as <math id="S2.SS2.p3.4.m4.1" class="ltx_Math" alttext="\mathcal{S}_{t}" display="inline"><semantics id="S2.SS2.p3.4.m4.1a"><msub id="S2.SS2.p3.4.m4.1.1" xref="S2.SS2.p3.4.m4.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p3.4.m4.1.1.2" xref="S2.SS2.p3.4.m4.1.1.2.cmml">𝒮</mi><mi id="S2.SS2.p3.4.m4.1.1.3" xref="S2.SS2.p3.4.m4.1.1.3.cmml">t</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.4.m4.1b"><apply id="S2.SS2.p3.4.m4.1.1.cmml" xref="S2.SS2.p3.4.m4.1.1"><csymbol cd="ambiguous" id="S2.SS2.p3.4.m4.1.1.1.cmml" xref="S2.SS2.p3.4.m4.1.1">subscript</csymbol><ci id="S2.SS2.p3.4.m4.1.1.2.cmml" xref="S2.SS2.p3.4.m4.1.1.2">𝒮</ci><ci id="S2.SS2.p3.4.m4.1.1.3.cmml" xref="S2.SS2.p3.4.m4.1.1.3">𝑡</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.4.m4.1c">\mathcal{S}_{t}</annotation></semantics></math>.
Equation <a href="#S2.E1" title="In 2.2 Designing ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">1</span></a> encapsulates the collection of conversational messages up to time <math id="S2.SS2.p3.5.m5.1" class="ltx_Math" alttext="t" display="inline"><semantics id="S2.SS2.p3.5.m5.1a"><mi id="S2.SS2.p3.5.m5.1.1" xref="S2.SS2.p3.5.m5.1.1.cmml">t</mi><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.5.m5.1b"><ci id="S2.SS2.p3.5.m5.1.1.cmml" xref="S2.SS2.p3.5.m5.1.1">𝑡</ci></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.5.m5.1c">t</annotation></semantics></math>.</p>
<table id="S2.E1" class="ltx_equation ltx_eqn_table">

<tbody><tr class="ltx_equation ltx_eqn_row ltx_align_baseline">
<td class="ltx_eqn_cell ltx_eqn_center_padleft"></td>
<td class="ltx_eqn_cell ltx_align_center"><math id="S2.E1.m1.3" class="ltx_Math" alttext="\mathcal{M}_{t}=\langle(\mathcal{I}_{1},\mathcal{A}_{1}),(\mathcal{I}_{2},\mathcal{A}_{2}),\cdots,(\mathcal{I}_{t},\mathcal{A}_{t})\rangle\qquad\mathcal{S}_{t}\leftarrow\psi(\mathcal{I}_{t},\mathcal{A}_{t})" display="block"><semantics id="S2.E1.m1.3a"><mrow id="S2.E1.m1.3.3.2" xref="S2.E1.m1.3.3.3.cmml"><mrow id="S2.E1.m1.2.2.1.1" xref="S2.E1.m1.2.2.1.1.cmml"><msub id="S2.E1.m1.2.2.1.1.5" xref="S2.E1.m1.2.2.1.1.5.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.2.2.1.1.5.2" xref="S2.E1.m1.2.2.1.1.5.2.cmml">ℳ</mi><mi id="S2.E1.m1.2.2.1.1.5.3" xref="S2.E1.m1.2.2.1.1.5.3.cmml">t</mi></msub><mo id="S2.E1.m1.2.2.1.1.4" xref="S2.E1.m1.2.2.1.1.4.cmml">=</mo><mrow id="S2.E1.m1.2.2.1.1.3.3" xref="S2.E1.m1.2.2.1.1.3.4.cmml"><mo stretchy="false" id="S2.E1.m1.2.2.1.1.3.3.4" xref="S2.E1.m1.2.2.1.1.3.4.cmml">⟨</mo><mrow id="S2.E1.m1.2.2.1.1.1.1.1.2" xref="S2.E1.m1.2.2.1.1.1.1.1.3.cmml"><mo stretchy="false" id="S2.E1.m1.2.2.1.1.1.1.1.2.3" xref="S2.E1.m1.2.2.1.1.1.1.1.3.cmml">(</mo><msub id="S2.E1.m1.2.2.1.1.1.1.1.1.1" xref="S2.E1.m1.2.2.1.1.1.1.1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.2.2.1.1.1.1.1.1.1.2" xref="S2.E1.m1.2.2.1.1.1.1.1.1.1.2.cmml">ℐ</mi><mn id="S2.E1.m1.2.2.1.1.1.1.1.1.1.3" xref="S2.E1.m1.2.2.1.1.1.1.1.1.1.3.cmml">1</mn></msub><mo id="S2.E1.m1.2.2.1.1.1.1.1.2.4" xref="S2.E1.m1.2.2.1.1.1.1.1.3.cmml">,</mo><msub id="S2.E1.m1.2.2.1.1.1.1.1.2.2" xref="S2.E1.m1.2.2.1.1.1.1.1.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.2.2.1.1.1.1.1.2.2.2" xref="S2.E1.m1.2.2.1.1.1.1.1.2.2.2.cmml">𝒜</mi><mn id="S2.E1.m1.2.2.1.1.1.1.1.2.2.3" xref="S2.E1.m1.2.2.1.1.1.1.1.2.2.3.cmml">1</mn></msub><mo stretchy="false" id="S2.E1.m1.2.2.1.1.1.1.1.2.5" xref="S2.E1.m1.2.2.1.1.1.1.1.3.cmml">)</mo></mrow><mo id="S2.E1.m1.2.2.1.1.3.3.5" xref="S2.E1.m1.2.2.1.1.3.4.cmml">,</mo><mrow id="S2.E1.m1.2.2.1.1.2.2.2.2" xref="S2.E1.m1.2.2.1.1.2.2.2.3.cmml"><mo stretchy="false" id="S2.E1.m1.2.2.1.1.2.2.2.2.3" xref="S2.E1.m1.2.2.1.1.2.2.2.3.cmml">(</mo><msub id="S2.E1.m1.2.2.1.1.2.2.2.1.1" xref="S2.E1.m1.2.2.1.1.2.2.2.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.2.2.1.1.2.2.2.1.1.2" xref="S2.E1.m1.2.2.1.1.2.2.2.1.1.2.cmml">ℐ</mi><mn id="S2.E1.m1.2.2.1.1.2.2.2.1.1.3" xref="S2.E1.m1.2.2.1.1.2.2.2.1.1.3.cmml">2</mn></msub><mo id="S2.E1.m1.2.2.1.1.2.2.2.2.4" xref="S2.E1.m1.2.2.1.1.2.2.2.3.cmml">,</mo><msub id="S2.E1.m1.2.2.1.1.2.2.2.2.2" xref="S2.E1.m1.2.2.1.1.2.2.2.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.2.2.1.1.2.2.2.2.2.2" xref="S2.E1.m1.2.2.1.1.2.2.2.2.2.2.cmml">𝒜</mi><mn id="S2.E1.m1.2.2.1.1.2.2.2.2.2.3" xref="S2.E1.m1.2.2.1.1.2.2.2.2.2.3.cmml">2</mn></msub><mo stretchy="false" id="S2.E1.m1.2.2.1.1.2.2.2.2.5" xref="S2.E1.m1.2.2.1.1.2.2.2.3.cmml">)</mo></mrow><mo id="S2.E1.m1.2.2.1.1.3.3.6" xref="S2.E1.m1.2.2.1.1.3.4.cmml">,</mo><mi mathvariant="normal" id="S2.E1.m1.1.1" xref="S2.E1.m1.1.1.cmml">⋯</mi><mo id="S2.E1.m1.2.2.1.1.3.3.7" xref="S2.E1.m1.2.2.1.1.3.4.cmml">,</mo><mrow id="S2.E1.m1.2.2.1.1.3.3.3.2" xref="S2.E1.m1.2.2.1.1.3.3.3.3.cmml"><mo stretchy="false" id="S2.E1.m1.2.2.1.1.3.3.3.2.3" xref="S2.E1.m1.2.2.1.1.3.3.3.3.cmml">(</mo><msub id="S2.E1.m1.2.2.1.1.3.3.3.1.1" xref="S2.E1.m1.2.2.1.1.3.3.3.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.2.2.1.1.3.3.3.1.1.2" xref="S2.E1.m1.2.2.1.1.3.3.3.1.1.2.cmml">ℐ</mi><mi id="S2.E1.m1.2.2.1.1.3.3.3.1.1.3" xref="S2.E1.m1.2.2.1.1.3.3.3.1.1.3.cmml">t</mi></msub><mo id="S2.E1.m1.2.2.1.1.3.3.3.2.4" xref="S2.E1.m1.2.2.1.1.3.3.3.3.cmml">,</mo><msub id="S2.E1.m1.2.2.1.1.3.3.3.2.2" xref="S2.E1.m1.2.2.1.1.3.3.3.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.2.2.1.1.3.3.3.2.2.2" xref="S2.E1.m1.2.2.1.1.3.3.3.2.2.2.cmml">𝒜</mi><mi id="S2.E1.m1.2.2.1.1.3.3.3.2.2.3" xref="S2.E1.m1.2.2.1.1.3.3.3.2.2.3.cmml">t</mi></msub><mo stretchy="false" id="S2.E1.m1.2.2.1.1.3.3.3.2.5" xref="S2.E1.m1.2.2.1.1.3.3.3.3.cmml">)</mo></mrow><mo stretchy="false" id="S2.E1.m1.2.2.1.1.3.3.8" xref="S2.E1.m1.2.2.1.1.3.4.cmml">⟩</mo></mrow></mrow><mspace width="2em" id="S2.E1.m1.3.3.2.3" xref="S2.E1.m1.3.3.3a.cmml"></mspace><mrow id="S2.E1.m1.3.3.2.2" xref="S2.E1.m1.3.3.2.2.cmml"><msub id="S2.E1.m1.3.3.2.2.4" xref="S2.E1.m1.3.3.2.2.4.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.3.3.2.2.4.2" xref="S2.E1.m1.3.3.2.2.4.2.cmml">𝒮</mi><mi id="S2.E1.m1.3.3.2.2.4.3" xref="S2.E1.m1.3.3.2.2.4.3.cmml">t</mi></msub><mo stretchy="false" id="S2.E1.m1.3.3.2.2.3" xref="S2.E1.m1.3.3.2.2.3.cmml">←</mo><mrow id="S2.E1.m1.3.3.2.2.2" xref="S2.E1.m1.3.3.2.2.2.cmml"><mi id="S2.E1.m1.3.3.2.2.2.4" xref="S2.E1.m1.3.3.2.2.2.4.cmml">ψ</mi><mo lspace="0em" rspace="0em" id="S2.E1.m1.3.3.2.2.2.3" xref="S2.E1.m1.3.3.2.2.2.3.cmml">​</mo><mrow id="S2.E1.m1.3.3.2.2.2.2.2" xref="S2.E1.m1.3.3.2.2.2.2.3.cmml"><mo stretchy="false" id="S2.E1.m1.3.3.2.2.2.2.2.3" xref="S2.E1.m1.3.3.2.2.2.2.3.cmml">(</mo><msub id="S2.E1.m1.3.3.2.2.1.1.1.1" xref="S2.E1.m1.3.3.2.2.1.1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.3.3.2.2.1.1.1.1.2" xref="S2.E1.m1.3.3.2.2.1.1.1.1.2.cmml">ℐ</mi><mi id="S2.E1.m1.3.3.2.2.1.1.1.1.3" xref="S2.E1.m1.3.3.2.2.1.1.1.1.3.cmml">t</mi></msub><mo id="S2.E1.m1.3.3.2.2.2.2.2.4" xref="S2.E1.m1.3.3.2.2.2.2.3.cmml">,</mo><msub id="S2.E1.m1.3.3.2.2.2.2.2.2" xref="S2.E1.m1.3.3.2.2.2.2.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E1.m1.3.3.2.2.2.2.2.2.2" xref="S2.E1.m1.3.3.2.2.2.2.2.2.2.cmml">𝒜</mi><mi id="S2.E1.m1.3.3.2.2.2.2.2.2.3" xref="S2.E1.m1.3.3.2.2.2.2.2.2.3.cmml">t</mi></msub><mo stretchy="false" id="S2.E1.m1.3.3.2.2.2.2.2.5" xref="S2.E1.m1.3.3.2.2.2.2.3.cmml">)</mo></mrow></mrow></mrow></mrow><annotation-xml encoding="MathML-Content" id="S2.E1.m1.3b"><apply id="S2.E1.m1.3.3.3.cmml" xref="S2.E1.m1.3.3.2"><csymbol cd="ambiguous" id="S2.E1.m1.3.3.3a.cmml" xref="S2.E1.m1.3.3.2.3">formulae-sequence</csymbol><apply id="S2.E1.m1.2.2.1.1.cmml" xref="S2.E1.m1.2.2.1.1"><eq id="S2.E1.m1.2.2.1.1.4.cmml" xref="S2.E1.m1.2.2.1.1.4"></eq><apply id="S2.E1.m1.2.2.1.1.5.cmml" xref="S2.E1.m1.2.2.1.1.5"><csymbol cd="ambiguous" id="S2.E1.m1.2.2.1.1.5.1.cmml" xref="S2.E1.m1.2.2.1.1.5">subscript</csymbol><ci id="S2.E1.m1.2.2.1.1.5.2.cmml" xref="S2.E1.m1.2.2.1.1.5.2">ℳ</ci><ci id="S2.E1.m1.2.2.1.1.5.3.cmml" xref="S2.E1.m1.2.2.1.1.5.3">𝑡</ci></apply><list id="S2.E1.m1.2.2.1.1.3.4.cmml" xref="S2.E1.m1.2.2.1.1.3.3"><interval closure="open" id="S2.E1.m1.2.2.1.1.1.1.1.3.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.2"><apply id="S2.E1.m1.2.2.1.1.1.1.1.1.1.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.1.1"><csymbol cd="ambiguous" id="S2.E1.m1.2.2.1.1.1.1.1.1.1.1.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.1.1">subscript</csymbol><ci id="S2.E1.m1.2.2.1.1.1.1.1.1.1.2.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.1.1.2">ℐ</ci><cn type="integer" id="S2.E1.m1.2.2.1.1.1.1.1.1.1.3.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.1.1.3">1</cn></apply><apply id="S2.E1.m1.2.2.1.1.1.1.1.2.2.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.2.2"><csymbol cd="ambiguous" id="S2.E1.m1.2.2.1.1.1.1.1.2.2.1.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.2.2">subscript</csymbol><ci id="S2.E1.m1.2.2.1.1.1.1.1.2.2.2.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.2.2.2">𝒜</ci><cn type="integer" id="S2.E1.m1.2.2.1.1.1.1.1.2.2.3.cmml" xref="S2.E1.m1.2.2.1.1.1.1.1.2.2.3">1</cn></apply></interval><interval closure="open" id="S2.E1.m1.2.2.1.1.2.2.2.3.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.2"><apply id="S2.E1.m1.2.2.1.1.2.2.2.1.1.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.1.1"><csymbol cd="ambiguous" id="S2.E1.m1.2.2.1.1.2.2.2.1.1.1.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.1.1">subscript</csymbol><ci id="S2.E1.m1.2.2.1.1.2.2.2.1.1.2.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.1.1.2">ℐ</ci><cn type="integer" id="S2.E1.m1.2.2.1.1.2.2.2.1.1.3.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.1.1.3">2</cn></apply><apply id="S2.E1.m1.2.2.1.1.2.2.2.2.2.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.2.2"><csymbol cd="ambiguous" id="S2.E1.m1.2.2.1.1.2.2.2.2.2.1.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.2.2">subscript</csymbol><ci id="S2.E1.m1.2.2.1.1.2.2.2.2.2.2.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.2.2.2">𝒜</ci><cn type="integer" id="S2.E1.m1.2.2.1.1.2.2.2.2.2.3.cmml" xref="S2.E1.m1.2.2.1.1.2.2.2.2.2.3">2</cn></apply></interval><ci id="S2.E1.m1.1.1.cmml" xref="S2.E1.m1.1.1">⋯</ci><interval closure="open" id="S2.E1.m1.2.2.1.1.3.3.3.3.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.2"><apply id="S2.E1.m1.2.2.1.1.3.3.3.1.1.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.1.1"><csymbol cd="ambiguous" id="S2.E1.m1.2.2.1.1.3.3.3.1.1.1.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.1.1">subscript</csymbol><ci id="S2.E1.m1.2.2.1.1.3.3.3.1.1.2.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.1.1.2">ℐ</ci><ci id="S2.E1.m1.2.2.1.1.3.3.3.1.1.3.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.1.1.3">𝑡</ci></apply><apply id="S2.E1.m1.2.2.1.1.3.3.3.2.2.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.2.2"><csymbol cd="ambiguous" id="S2.E1.m1.2.2.1.1.3.3.3.2.2.1.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.2.2">subscript</csymbol><ci id="S2.E1.m1.2.2.1.1.3.3.3.2.2.2.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.2.2.2">𝒜</ci><ci id="S2.E1.m1.2.2.1.1.3.3.3.2.2.3.cmml" xref="S2.E1.m1.2.2.1.1.3.3.3.2.2.3">𝑡</ci></apply></interval></list></apply><apply id="S2.E1.m1.3.3.2.2.cmml" xref="S2.E1.m1.3.3.2.2"><ci id="S2.E1.m1.3.3.2.2.3.cmml" xref="S2.E1.m1.3.3.2.2.3">←</ci><apply id="S2.E1.m1.3.3.2.2.4.cmml" xref="S2.E1.m1.3.3.2.2.4"><csymbol cd="ambiguous" id="S2.E1.m1.3.3.2.2.4.1.cmml" xref="S2.E1.m1.3.3.2.2.4">subscript</csymbol><ci id="S2.E1.m1.3.3.2.2.4.2.cmml" xref="S2.E1.m1.3.3.2.2.4.2">𝒮</ci><ci id="S2.E1.m1.3.3.2.2.4.3.cmml" xref="S2.E1.m1.3.3.2.2.4.3">𝑡</ci></apply><apply id="S2.E1.m1.3.3.2.2.2.cmml" xref="S2.E1.m1.3.3.2.2.2"><times id="S2.E1.m1.3.3.2.2.2.3.cmml" xref="S2.E1.m1.3.3.2.2.2.3"></times><ci id="S2.E1.m1.3.3.2.2.2.4.cmml" xref="S2.E1.m1.3.3.2.2.2.4">𝜓</ci><interval closure="open" id="S2.E1.m1.3.3.2.2.2.2.3.cmml" xref="S2.E1.m1.3.3.2.2.2.2.2"><apply id="S2.E1.m1.3.3.2.2.1.1.1.1.cmml" xref="S2.E1.m1.3.3.2.2.1.1.1.1"><csymbol cd="ambiguous" id="S2.E1.m1.3.3.2.2.1.1.1.1.1.cmml" xref="S2.E1.m1.3.3.2.2.1.1.1.1">subscript</csymbol><ci id="S2.E1.m1.3.3.2.2.1.1.1.1.2.cmml" xref="S2.E1.m1.3.3.2.2.1.1.1.1.2">ℐ</ci><ci id="S2.E1.m1.3.3.2.2.1.1.1.1.3.cmml" xref="S2.E1.m1.3.3.2.2.1.1.1.1.3">𝑡</ci></apply><apply id="S2.E1.m1.3.3.2.2.2.2.2.2.cmml" xref="S2.E1.m1.3.3.2.2.2.2.2.2"><csymbol cd="ambiguous" id="S2.E1.m1.3.3.2.2.2.2.2.2.1.cmml" xref="S2.E1.m1.3.3.2.2.2.2.2.2">subscript</csymbol><ci id="S2.E1.m1.3.3.2.2.2.2.2.2.2.cmml" xref="S2.E1.m1.3.3.2.2.2.2.2.2.2">𝒜</ci><ci id="S2.E1.m1.3.3.2.2.2.2.2.2.3.cmml" xref="S2.E1.m1.3.3.2.2.2.2.2.2.3">𝑡</ci></apply></interval></apply></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.E1.m1.3c">\mathcal{M}_{t}=\langle(\mathcal{I}_{1},\mathcal{A}_{1}),(\mathcal{I}_{2},\mathcal{A}_{2}),\cdots,(\mathcal{I}_{t},\mathcal{A}_{t})\rangle\qquad\mathcal{S}_{t}\leftarrow\psi(\mathcal{I}_{t},\mathcal{A}_{t})</annotation></semantics></math></td>
<td class="ltx_eqn_cell ltx_eqn_center_padright"></td>
<td rowspan="1" class="ltx_eqn_cell ltx_eqn_eqno ltx_align_middle ltx_align_right"><span class="ltx_tag ltx_tag_equation ltx_align_right">(1)</span></td>
</tr></tbody>
</table>
<p id="S2.SS2.p3.11" class="ltx_p">where <math id="S2.SS2.p3.6.m1.1" class="ltx_Math" alttext="\psi" display="inline"><semantics id="S2.SS2.p3.6.m1.1a"><mi id="S2.SS2.p3.6.m1.1.1" xref="S2.SS2.p3.6.m1.1.1.cmml">ψ</mi><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.6.m1.1b"><ci id="S2.SS2.p3.6.m1.1.1.cmml" xref="S2.SS2.p3.6.m1.1.1">𝜓</ci></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.6.m1.1c">\psi</annotation></semantics></math> represents a LLM-based decision extractor which can be implemented via communication protocol detection or self-reflection (detailed below).
In the succeeding time step <math id="S2.SS2.p3.7.m2.1" class="ltx_Math" alttext="t+1" display="inline"><semantics id="S2.SS2.p3.7.m2.1a"><mrow id="S2.SS2.p3.7.m2.1.1" xref="S2.SS2.p3.7.m2.1.1.cmml"><mi id="S2.SS2.p3.7.m2.1.1.2" xref="S2.SS2.p3.7.m2.1.1.2.cmml">t</mi><mo id="S2.SS2.p3.7.m2.1.1.1" xref="S2.SS2.p3.7.m2.1.1.1.cmml">+</mo><mn id="S2.SS2.p3.7.m2.1.1.3" xref="S2.SS2.p3.7.m2.1.1.3.cmml">1</mn></mrow><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.7.m2.1b"><apply id="S2.SS2.p3.7.m2.1.1.cmml" xref="S2.SS2.p3.7.m2.1.1"><plus id="S2.SS2.p3.7.m2.1.1.1.cmml" xref="S2.SS2.p3.7.m2.1.1.1"></plus><ci id="S2.SS2.p3.7.m2.1.1.2.cmml" xref="S2.SS2.p3.7.m2.1.1.2">𝑡</ci><cn type="integer" id="S2.SS2.p3.7.m2.1.1.3.cmml" xref="S2.SS2.p3.7.m2.1.1.3">1</cn></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.7.m2.1c">t+1</annotation></semantics></math>, the instructor leverages the historical dialogue message set <math id="S2.SS2.p3.8.m3.1" class="ltx_Math" alttext="\mathcal{M}_{t}" display="inline"><semantics id="S2.SS2.p3.8.m3.1a"><msub id="S2.SS2.p3.8.m3.1.1" xref="S2.SS2.p3.8.m3.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p3.8.m3.1.1.2" xref="S2.SS2.p3.8.m3.1.1.2.cmml">ℳ</mi><mi id="S2.SS2.p3.8.m3.1.1.3" xref="S2.SS2.p3.8.m3.1.1.3.cmml">t</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.8.m3.1b"><apply id="S2.SS2.p3.8.m3.1.1.cmml" xref="S2.SS2.p3.8.m3.1.1"><csymbol cd="ambiguous" id="S2.SS2.p3.8.m3.1.1.1.cmml" xref="S2.SS2.p3.8.m3.1.1">subscript</csymbol><ci id="S2.SS2.p3.8.m3.1.1.2.cmml" xref="S2.SS2.p3.8.m3.1.1.2">ℳ</ci><ci id="S2.SS2.p3.8.m3.1.1.3.cmml" xref="S2.SS2.p3.8.m3.1.1.3">𝑡</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.8.m3.1c">\mathcal{M}_{t}</annotation></semantics></math> to impart a fresh instruction, <math id="S2.SS2.p3.9.m4.1" class="ltx_Math" alttext="\mathcal{I}_{t+1}" display="inline"><semantics id="S2.SS2.p3.9.m4.1a"><msub id="S2.SS2.p3.9.m4.1.1" xref="S2.SS2.p3.9.m4.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p3.9.m4.1.1.2" xref="S2.SS2.p3.9.m4.1.1.2.cmml">ℐ</mi><mrow id="S2.SS2.p3.9.m4.1.1.3" xref="S2.SS2.p3.9.m4.1.1.3.cmml"><mi id="S2.SS2.p3.9.m4.1.1.3.2" xref="S2.SS2.p3.9.m4.1.1.3.2.cmml">t</mi><mo id="S2.SS2.p3.9.m4.1.1.3.1" xref="S2.SS2.p3.9.m4.1.1.3.1.cmml">+</mo><mn id="S2.SS2.p3.9.m4.1.1.3.3" xref="S2.SS2.p3.9.m4.1.1.3.3.cmml">1</mn></mrow></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.9.m4.1b"><apply id="S2.SS2.p3.9.m4.1.1.cmml" xref="S2.SS2.p3.9.m4.1.1"><csymbol cd="ambiguous" id="S2.SS2.p3.9.m4.1.1.1.cmml" xref="S2.SS2.p3.9.m4.1.1">subscript</csymbol><ci id="S2.SS2.p3.9.m4.1.1.2.cmml" xref="S2.SS2.p3.9.m4.1.1.2">ℐ</ci><apply id="S2.SS2.p3.9.m4.1.1.3.cmml" xref="S2.SS2.p3.9.m4.1.1.3"><plus id="S2.SS2.p3.9.m4.1.1.3.1.cmml" xref="S2.SS2.p3.9.m4.1.1.3.1"></plus><ci id="S2.SS2.p3.9.m4.1.1.3.2.cmml" xref="S2.SS2.p3.9.m4.1.1.3.2">𝑡</ci><cn type="integer" id="S2.SS2.p3.9.m4.1.1.3.3.cmml" xref="S2.SS2.p3.9.m4.1.1.3.3">1</cn></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.9.m4.1c">\mathcal{I}_{t+1}</annotation></semantics></math>, which is then conveyed to the assistant along with <math id="S2.SS2.p3.10.m5.1" class="ltx_Math" alttext="\mathcal{M}_{t}" display="inline"><semantics id="S2.SS2.p3.10.m5.1a"><msub id="S2.SS2.p3.10.m5.1.1" xref="S2.SS2.p3.10.m5.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p3.10.m5.1.1.2" xref="S2.SS2.p3.10.m5.1.1.2.cmml">ℳ</mi><mi id="S2.SS2.p3.10.m5.1.1.3" xref="S2.SS2.p3.10.m5.1.1.3.cmml">t</mi></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.10.m5.1b"><apply id="S2.SS2.p3.10.m5.1.1.cmml" xref="S2.SS2.p3.10.m5.1.1"><csymbol cd="ambiguous" id="S2.SS2.p3.10.m5.1.1.1.cmml" xref="S2.SS2.p3.10.m5.1.1">subscript</csymbol><ci id="S2.SS2.p3.10.m5.1.1.2.cmml" xref="S2.SS2.p3.10.m5.1.1.2">ℳ</ci><ci id="S2.SS2.p3.10.m5.1.1.3.cmml" xref="S2.SS2.p3.10.m5.1.1.3">𝑡</ci></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.10.m5.1c">\mathcal{M}_{t}</annotation></semantics></math>, as illustrated in Figure <a href="#S2.F3.sf2" title="In Figure 3 ‣ 2.2 Designing ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">3(b)</span></a>.
The assistant responds with a solution or message, denoted as <math id="S2.SS2.p3.11.m6.1" class="ltx_Math" alttext="\mathcal{A}_{t+1}" display="inline"><semantics id="S2.SS2.p3.11.m6.1a"><msub id="S2.SS2.p3.11.m6.1.1" xref="S2.SS2.p3.11.m6.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p3.11.m6.1.1.2" xref="S2.SS2.p3.11.m6.1.1.2.cmml">𝒜</mi><mrow id="S2.SS2.p3.11.m6.1.1.3" xref="S2.SS2.p3.11.m6.1.1.3.cmml"><mi id="S2.SS2.p3.11.m6.1.1.3.2" xref="S2.SS2.p3.11.m6.1.1.3.2.cmml">t</mi><mo id="S2.SS2.p3.11.m6.1.1.3.1" xref="S2.SS2.p3.11.m6.1.1.3.1.cmml">+</mo><mn id="S2.SS2.p3.11.m6.1.1.3.3" xref="S2.SS2.p3.11.m6.1.1.3.3.cmml">1</mn></mrow></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p3.11.m6.1b"><apply id="S2.SS2.p3.11.m6.1.1.cmml" xref="S2.SS2.p3.11.m6.1.1"><csymbol cd="ambiguous" id="S2.SS2.p3.11.m6.1.1.1.cmml" xref="S2.SS2.p3.11.m6.1.1">subscript</csymbol><ci id="S2.SS2.p3.11.m6.1.1.2.cmml" xref="S2.SS2.p3.11.m6.1.1.2">𝒜</ci><apply id="S2.SS2.p3.11.m6.1.1.3.cmml" xref="S2.SS2.p3.11.m6.1.1.3"><plus id="S2.SS2.p3.11.m6.1.1.3.1.cmml" xref="S2.SS2.p3.11.m6.1.1.3.1"></plus><ci id="S2.SS2.p3.11.m6.1.1.3.2.cmml" xref="S2.SS2.p3.11.m6.1.1.3.2">𝑡</ci><cn type="integer" id="S2.SS2.p3.11.m6.1.1.3.3.cmml" xref="S2.SS2.p3.11.m6.1.1.3.3">1</cn></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p3.11.m6.1c">\mathcal{A}_{t+1}</annotation></semantics></math> in Equation <a href="#S2.E2" title="In 2.2 Designing ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">2</span></a>:</p>
<table id="S2.E2" class="ltx_equation ltx_eqn_table">

<tbody><tr class="ltx_equation ltx_eqn_row ltx_align_baseline">
<td class="ltx_eqn_cell ltx_eqn_center_padleft"></td>
<td class="ltx_eqn_cell ltx_align_center"><math id="S2.E2.m1.2" class="ltx_Math" alttext="\mathcal{I}_{t+1}=\mathcal{A}(\mathcal{M}_{t},\mathcal{S}_{t})\qquad\mathcal{A}_{t+1}=\mathcal{I}(\mathcal{M}_{t},\mathcal{I}_{t+1},\mathcal{S}_{t})" display="block"><semantics id="S2.E2.m1.2a"><mrow id="S2.E2.m1.2.2.2" xref="S2.E2.m1.2.2.3.cmml"><mrow id="S2.E2.m1.1.1.1.1" xref="S2.E2.m1.1.1.1.1.cmml"><msub id="S2.E2.m1.1.1.1.1.4" xref="S2.E2.m1.1.1.1.1.4.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.1.1.1.1.4.2" xref="S2.E2.m1.1.1.1.1.4.2.cmml">ℐ</mi><mrow id="S2.E2.m1.1.1.1.1.4.3" xref="S2.E2.m1.1.1.1.1.4.3.cmml"><mi id="S2.E2.m1.1.1.1.1.4.3.2" xref="S2.E2.m1.1.1.1.1.4.3.2.cmml">t</mi><mo id="S2.E2.m1.1.1.1.1.4.3.1" xref="S2.E2.m1.1.1.1.1.4.3.1.cmml">+</mo><mn id="S2.E2.m1.1.1.1.1.4.3.3" xref="S2.E2.m1.1.1.1.1.4.3.3.cmml">1</mn></mrow></msub><mo id="S2.E2.m1.1.1.1.1.3" xref="S2.E2.m1.1.1.1.1.3.cmml">=</mo><mrow id="S2.E2.m1.1.1.1.1.2" xref="S2.E2.m1.1.1.1.1.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.1.1.1.1.2.4" xref="S2.E2.m1.1.1.1.1.2.4.cmml">𝒜</mi><mo lspace="0em" rspace="0em" id="S2.E2.m1.1.1.1.1.2.3" xref="S2.E2.m1.1.1.1.1.2.3.cmml">​</mo><mrow id="S2.E2.m1.1.1.1.1.2.2.2" xref="S2.E2.m1.1.1.1.1.2.2.3.cmml"><mo stretchy="false" id="S2.E2.m1.1.1.1.1.2.2.2.3" xref="S2.E2.m1.1.1.1.1.2.2.3.cmml">(</mo><msub id="S2.E2.m1.1.1.1.1.1.1.1.1" xref="S2.E2.m1.1.1.1.1.1.1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.1.1.1.1.1.1.1.1.2" xref="S2.E2.m1.1.1.1.1.1.1.1.1.2.cmml">ℳ</mi><mi id="S2.E2.m1.1.1.1.1.1.1.1.1.3" xref="S2.E2.m1.1.1.1.1.1.1.1.1.3.cmml">t</mi></msub><mo id="S2.E2.m1.1.1.1.1.2.2.2.4" xref="S2.E2.m1.1.1.1.1.2.2.3.cmml">,</mo><msub id="S2.E2.m1.1.1.1.1.2.2.2.2" xref="S2.E2.m1.1.1.1.1.2.2.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.1.1.1.1.2.2.2.2.2" xref="S2.E2.m1.1.1.1.1.2.2.2.2.2.cmml">𝒮</mi><mi id="S2.E2.m1.1.1.1.1.2.2.2.2.3" xref="S2.E2.m1.1.1.1.1.2.2.2.2.3.cmml">t</mi></msub><mo stretchy="false" id="S2.E2.m1.1.1.1.1.2.2.2.5" xref="S2.E2.m1.1.1.1.1.2.2.3.cmml">)</mo></mrow></mrow></mrow><mspace width="2em" id="S2.E2.m1.2.2.2.3" xref="S2.E2.m1.2.2.3a.cmml"></mspace><mrow id="S2.E2.m1.2.2.2.2" xref="S2.E2.m1.2.2.2.2.cmml"><msub id="S2.E2.m1.2.2.2.2.5" xref="S2.E2.m1.2.2.2.2.5.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.2.2.2.2.5.2" xref="S2.E2.m1.2.2.2.2.5.2.cmml">𝒜</mi><mrow id="S2.E2.m1.2.2.2.2.5.3" xref="S2.E2.m1.2.2.2.2.5.3.cmml"><mi id="S2.E2.m1.2.2.2.2.5.3.2" xref="S2.E2.m1.2.2.2.2.5.3.2.cmml">t</mi><mo id="S2.E2.m1.2.2.2.2.5.3.1" xref="S2.E2.m1.2.2.2.2.5.3.1.cmml">+</mo><mn id="S2.E2.m1.2.2.2.2.5.3.3" xref="S2.E2.m1.2.2.2.2.5.3.3.cmml">1</mn></mrow></msub><mo id="S2.E2.m1.2.2.2.2.4" xref="S2.E2.m1.2.2.2.2.4.cmml">=</mo><mrow id="S2.E2.m1.2.2.2.2.3" xref="S2.E2.m1.2.2.2.2.3.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.2.2.2.2.3.5" xref="S2.E2.m1.2.2.2.2.3.5.cmml">ℐ</mi><mo lspace="0em" rspace="0em" id="S2.E2.m1.2.2.2.2.3.4" xref="S2.E2.m1.2.2.2.2.3.4.cmml">​</mo><mrow id="S2.E2.m1.2.2.2.2.3.3.3" xref="S2.E2.m1.2.2.2.2.3.3.4.cmml"><mo stretchy="false" id="S2.E2.m1.2.2.2.2.3.3.3.4" xref="S2.E2.m1.2.2.2.2.3.3.4.cmml">(</mo><msub id="S2.E2.m1.2.2.2.2.1.1.1.1" xref="S2.E2.m1.2.2.2.2.1.1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.2.2.2.2.1.1.1.1.2" xref="S2.E2.m1.2.2.2.2.1.1.1.1.2.cmml">ℳ</mi><mi id="S2.E2.m1.2.2.2.2.1.1.1.1.3" xref="S2.E2.m1.2.2.2.2.1.1.1.1.3.cmml">t</mi></msub><mo id="S2.E2.m1.2.2.2.2.3.3.3.5" xref="S2.E2.m1.2.2.2.2.3.3.4.cmml">,</mo><msub id="S2.E2.m1.2.2.2.2.2.2.2.2" xref="S2.E2.m1.2.2.2.2.2.2.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.2.2.2.2.2.2.2.2.2" xref="S2.E2.m1.2.2.2.2.2.2.2.2.2.cmml">ℐ</mi><mrow id="S2.E2.m1.2.2.2.2.2.2.2.2.3" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3.cmml"><mi id="S2.E2.m1.2.2.2.2.2.2.2.2.3.2" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3.2.cmml">t</mi><mo id="S2.E2.m1.2.2.2.2.2.2.2.2.3.1" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3.1.cmml">+</mo><mn id="S2.E2.m1.2.2.2.2.2.2.2.2.3.3" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3.3.cmml">1</mn></mrow></msub><mo id="S2.E2.m1.2.2.2.2.3.3.3.6" xref="S2.E2.m1.2.2.2.2.3.3.4.cmml">,</mo><msub id="S2.E2.m1.2.2.2.2.3.3.3.3" xref="S2.E2.m1.2.2.2.2.3.3.3.3.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E2.m1.2.2.2.2.3.3.3.3.2" xref="S2.E2.m1.2.2.2.2.3.3.3.3.2.cmml">𝒮</mi><mi id="S2.E2.m1.2.2.2.2.3.3.3.3.3" xref="S2.E2.m1.2.2.2.2.3.3.3.3.3.cmml">t</mi></msub><mo stretchy="false" id="S2.E2.m1.2.2.2.2.3.3.3.7" xref="S2.E2.m1.2.2.2.2.3.3.4.cmml">)</mo></mrow></mrow></mrow></mrow><annotation-xml encoding="MathML-Content" id="S2.E2.m1.2b"><apply id="S2.E2.m1.2.2.3.cmml" xref="S2.E2.m1.2.2.2"><csymbol cd="ambiguous" id="S2.E2.m1.2.2.3a.cmml" xref="S2.E2.m1.2.2.2.3">formulae-sequence</csymbol><apply id="S2.E2.m1.1.1.1.1.cmml" xref="S2.E2.m1.1.1.1.1"><eq id="S2.E2.m1.1.1.1.1.3.cmml" xref="S2.E2.m1.1.1.1.1.3"></eq><apply id="S2.E2.m1.1.1.1.1.4.cmml" xref="S2.E2.m1.1.1.1.1.4"><csymbol cd="ambiguous" id="S2.E2.m1.1.1.1.1.4.1.cmml" xref="S2.E2.m1.1.1.1.1.4">subscript</csymbol><ci id="S2.E2.m1.1.1.1.1.4.2.cmml" xref="S2.E2.m1.1.1.1.1.4.2">ℐ</ci><apply id="S2.E2.m1.1.1.1.1.4.3.cmml" xref="S2.E2.m1.1.1.1.1.4.3"><plus id="S2.E2.m1.1.1.1.1.4.3.1.cmml" xref="S2.E2.m1.1.1.1.1.4.3.1"></plus><ci id="S2.E2.m1.1.1.1.1.4.3.2.cmml" xref="S2.E2.m1.1.1.1.1.4.3.2">𝑡</ci><cn type="integer" id="S2.E2.m1.1.1.1.1.4.3.3.cmml" xref="S2.E2.m1.1.1.1.1.4.3.3">1</cn></apply></apply><apply id="S2.E2.m1.1.1.1.1.2.cmml" xref="S2.E2.m1.1.1.1.1.2"><times id="S2.E2.m1.1.1.1.1.2.3.cmml" xref="S2.E2.m1.1.1.1.1.2.3"></times><ci id="S2.E2.m1.1.1.1.1.2.4.cmml" xref="S2.E2.m1.1.1.1.1.2.4">𝒜</ci><interval closure="open" id="S2.E2.m1.1.1.1.1.2.2.3.cmml" xref="S2.E2.m1.1.1.1.1.2.2.2"><apply id="S2.E2.m1.1.1.1.1.1.1.1.1.cmml" xref="S2.E2.m1.1.1.1.1.1.1.1.1"><csymbol cd="ambiguous" id="S2.E2.m1.1.1.1.1.1.1.1.1.1.cmml" xref="S2.E2.m1.1.1.1.1.1.1.1.1">subscript</csymbol><ci id="S2.E2.m1.1.1.1.1.1.1.1.1.2.cmml" xref="S2.E2.m1.1.1.1.1.1.1.1.1.2">ℳ</ci><ci id="S2.E2.m1.1.1.1.1.1.1.1.1.3.cmml" xref="S2.E2.m1.1.1.1.1.1.1.1.1.3">𝑡</ci></apply><apply id="S2.E2.m1.1.1.1.1.2.2.2.2.cmml" xref="S2.E2.m1.1.1.1.1.2.2.2.2"><csymbol cd="ambiguous" id="S2.E2.m1.1.1.1.1.2.2.2.2.1.cmml" xref="S2.E2.m1.1.1.1.1.2.2.2.2">subscript</csymbol><ci id="S2.E2.m1.1.1.1.1.2.2.2.2.2.cmml" xref="S2.E2.m1.1.1.1.1.2.2.2.2.2">𝒮</ci><ci id="S2.E2.m1.1.1.1.1.2.2.2.2.3.cmml" xref="S2.E2.m1.1.1.1.1.2.2.2.2.3">𝑡</ci></apply></interval></apply></apply><apply id="S2.E2.m1.2.2.2.2.cmml" xref="S2.E2.m1.2.2.2.2"><eq id="S2.E2.m1.2.2.2.2.4.cmml" xref="S2.E2.m1.2.2.2.2.4"></eq><apply id="S2.E2.m1.2.2.2.2.5.cmml" xref="S2.E2.m1.2.2.2.2.5"><csymbol cd="ambiguous" id="S2.E2.m1.2.2.2.2.5.1.cmml" xref="S2.E2.m1.2.2.2.2.5">subscript</csymbol><ci id="S2.E2.m1.2.2.2.2.5.2.cmml" xref="S2.E2.m1.2.2.2.2.5.2">𝒜</ci><apply id="S2.E2.m1.2.2.2.2.5.3.cmml" xref="S2.E2.m1.2.2.2.2.5.3"><plus id="S2.E2.m1.2.2.2.2.5.3.1.cmml" xref="S2.E2.m1.2.2.2.2.5.3.1"></plus><ci id="S2.E2.m1.2.2.2.2.5.3.2.cmml" xref="S2.E2.m1.2.2.2.2.5.3.2">𝑡</ci><cn type="integer" id="S2.E2.m1.2.2.2.2.5.3.3.cmml" xref="S2.E2.m1.2.2.2.2.5.3.3">1</cn></apply></apply><apply id="S2.E2.m1.2.2.2.2.3.cmml" xref="S2.E2.m1.2.2.2.2.3"><times id="S2.E2.m1.2.2.2.2.3.4.cmml" xref="S2.E2.m1.2.2.2.2.3.4"></times><ci id="S2.E2.m1.2.2.2.2.3.5.cmml" xref="S2.E2.m1.2.2.2.2.3.5">ℐ</ci><vector id="S2.E2.m1.2.2.2.2.3.3.4.cmml" xref="S2.E2.m1.2.2.2.2.3.3.3"><apply id="S2.E2.m1.2.2.2.2.1.1.1.1.cmml" xref="S2.E2.m1.2.2.2.2.1.1.1.1"><csymbol cd="ambiguous" id="S2.E2.m1.2.2.2.2.1.1.1.1.1.cmml" xref="S2.E2.m1.2.2.2.2.1.1.1.1">subscript</csymbol><ci id="S2.E2.m1.2.2.2.2.1.1.1.1.2.cmml" xref="S2.E2.m1.2.2.2.2.1.1.1.1.2">ℳ</ci><ci id="S2.E2.m1.2.2.2.2.1.1.1.1.3.cmml" xref="S2.E2.m1.2.2.2.2.1.1.1.1.3">𝑡</ci></apply><apply id="S2.E2.m1.2.2.2.2.2.2.2.2.cmml" xref="S2.E2.m1.2.2.2.2.2.2.2.2"><csymbol cd="ambiguous" id="S2.E2.m1.2.2.2.2.2.2.2.2.1.cmml" xref="S2.E2.m1.2.2.2.2.2.2.2.2">subscript</csymbol><ci id="S2.E2.m1.2.2.2.2.2.2.2.2.2.cmml" xref="S2.E2.m1.2.2.2.2.2.2.2.2.2">ℐ</ci><apply id="S2.E2.m1.2.2.2.2.2.2.2.2.3.cmml" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3"><plus id="S2.E2.m1.2.2.2.2.2.2.2.2.3.1.cmml" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3.1"></plus><ci id="S2.E2.m1.2.2.2.2.2.2.2.2.3.2.cmml" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3.2">𝑡</ci><cn type="integer" id="S2.E2.m1.2.2.2.2.2.2.2.2.3.3.cmml" xref="S2.E2.m1.2.2.2.2.2.2.2.2.3.3">1</cn></apply></apply><apply id="S2.E2.m1.2.2.2.2.3.3.3.3.cmml" xref="S2.E2.m1.2.2.2.2.3.3.3.3"><csymbol cd="ambiguous" id="S2.E2.m1.2.2.2.2.3.3.3.3.1.cmml" xref="S2.E2.m1.2.2.2.2.3.3.3.3">subscript</csymbol><ci id="S2.E2.m1.2.2.2.2.3.3.3.3.2.cmml" xref="S2.E2.m1.2.2.2.2.3.3.3.3.2">𝒮</ci><ci id="S2.E2.m1.2.2.2.2.3.3.3.3.3.cmml" xref="S2.E2.m1.2.2.2.2.3.3.3.3.3">𝑡</ci></apply></vector></apply></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.E2.m1.2c">\mathcal{I}_{t+1}=\mathcal{A}(\mathcal{M}_{t},\mathcal{S}_{t})\qquad\mathcal{A}_{t+1}=\mathcal{I}(\mathcal{M}_{t},\mathcal{I}_{t+1},\mathcal{S}_{t})</annotation></semantics></math></td>
<td class="ltx_eqn_cell ltx_eqn_center_padright"></td>
<td rowspan="1" class="ltx_eqn_cell ltx_eqn_eqno ltx_align_middle ltx_align_right"><span class="ltx_tag ltx_tag_equation ltx_align_right">(2)</span></td>
</tr></tbody>
</table>
</div>
<div id="S2.SS2.p4" class="ltx_para ltx_noindent">
<p id="S2.SS2.p4.2" class="ltx_p">Following the acquisition of the solution <math id="S2.SS2.p4.1.m1.1" class="ltx_Math" alttext="\mathcal{A}_{t+1}" display="inline"><semantics id="S2.SS2.p4.1.m1.1a"><msub id="S2.SS2.p4.1.m1.1.1" xref="S2.SS2.p4.1.m1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p4.1.m1.1.1.2" xref="S2.SS2.p4.1.m1.1.1.2.cmml">𝒜</mi><mrow id="S2.SS2.p4.1.m1.1.1.3" xref="S2.SS2.p4.1.m1.1.1.3.cmml"><mi id="S2.SS2.p4.1.m1.1.1.3.2" xref="S2.SS2.p4.1.m1.1.1.3.2.cmml">t</mi><mo id="S2.SS2.p4.1.m1.1.1.3.1" xref="S2.SS2.p4.1.m1.1.1.3.1.cmml">+</mo><mn id="S2.SS2.p4.1.m1.1.1.3.3" xref="S2.SS2.p4.1.m1.1.1.3.3.cmml">1</mn></mrow></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p4.1.m1.1b"><apply id="S2.SS2.p4.1.m1.1.1.cmml" xref="S2.SS2.p4.1.m1.1.1"><csymbol cd="ambiguous" id="S2.SS2.p4.1.m1.1.1.1.cmml" xref="S2.SS2.p4.1.m1.1.1">subscript</csymbol><ci id="S2.SS2.p4.1.m1.1.1.2.cmml" xref="S2.SS2.p4.1.m1.1.1.2">𝒜</ci><apply id="S2.SS2.p4.1.m1.1.1.3.cmml" xref="S2.SS2.p4.1.m1.1.1.3"><plus id="S2.SS2.p4.1.m1.1.1.3.1.cmml" xref="S2.SS2.p4.1.m1.1.1.3.1"></plus><ci id="S2.SS2.p4.1.m1.1.1.3.2.cmml" xref="S2.SS2.p4.1.m1.1.1.3.2">𝑡</ci><cn type="integer" id="S2.SS2.p4.1.m1.1.1.3.3.cmml" xref="S2.SS2.p4.1.m1.1.1.3.3">1</cn></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p4.1.m1.1c">\mathcal{A}_{t+1}</annotation></semantics></math> in response to the instruction <math id="S2.SS2.p4.2.m2.1" class="ltx_Math" alttext="\mathcal{I}_{t+1}" display="inline"><semantics id="S2.SS2.p4.2.m2.1a"><msub id="S2.SS2.p4.2.m2.1.1" xref="S2.SS2.p4.2.m2.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.SS2.p4.2.m2.1.1.2" xref="S2.SS2.p4.2.m2.1.1.2.cmml">ℐ</mi><mrow id="S2.SS2.p4.2.m2.1.1.3" xref="S2.SS2.p4.2.m2.1.1.3.cmml"><mi id="S2.SS2.p4.2.m2.1.1.3.2" xref="S2.SS2.p4.2.m2.1.1.3.2.cmml">t</mi><mo id="S2.SS2.p4.2.m2.1.1.3.1" xref="S2.SS2.p4.2.m2.1.1.3.1.cmml">+</mo><mn id="S2.SS2.p4.2.m2.1.1.3.3" xref="S2.SS2.p4.2.m2.1.1.3.3.cmml">1</mn></mrow></msub><annotation-xml encoding="MathML-Content" id="S2.SS2.p4.2.m2.1b"><apply id="S2.SS2.p4.2.m2.1.1.cmml" xref="S2.SS2.p4.2.m2.1.1"><csymbol cd="ambiguous" id="S2.SS2.p4.2.m2.1.1.1.cmml" xref="S2.SS2.p4.2.m2.1.1">subscript</csymbol><ci id="S2.SS2.p4.2.m2.1.1.2.cmml" xref="S2.SS2.p4.2.m2.1.1.2">ℐ</ci><apply id="S2.SS2.p4.2.m2.1.1.3.cmml" xref="S2.SS2.p4.2.m2.1.1.3"><plus id="S2.SS2.p4.2.m2.1.1.3.1.cmml" xref="S2.SS2.p4.2.m2.1.1.3.1"></plus><ci id="S2.SS2.p4.2.m2.1.1.3.2.cmml" xref="S2.SS2.p4.2.m2.1.1.3.2">𝑡</ci><cn type="integer" id="S2.SS2.p4.2.m2.1.1.3.3.cmml" xref="S2.SS2.p4.2.m2.1.1.3.3">1</cn></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p4.2.m2.1c">\mathcal{I}_{t+1}</annotation></semantics></math>, the message stream undergoes an update process utilizing Equation <a href="#S2.E3" title="In 2.2 Designing ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">3</span></a>:</p>
<table id="S2.E3" class="ltx_equation ltx_eqn_table">

<tbody><tr class="ltx_equation ltx_eqn_row ltx_align_baseline">
<td class="ltx_eqn_cell ltx_eqn_center_padleft"></td>
<td class="ltx_eqn_cell ltx_align_center"><math id="S2.E3.m1.2" class="ltx_Math" alttext="\mathcal{M}_{t+1}=\mathcal{M}_{t}\cup(\mathcal{I}_{t+1},\mathcal{A}_{t+1})\qquad\mathcal{S}_{t+1}=\mathcal{S}_{t}\cup\psi(\mathcal{I}_{t+1},\mathcal{A}_{t+1})" display="block"><semantics id="S2.E3.m1.2a"><mrow id="S2.E3.m1.2.2.2" xref="S2.E3.m1.2.2.3.cmml"><mrow id="S2.E3.m1.1.1.1.1" xref="S2.E3.m1.1.1.1.1.cmml"><msub id="S2.E3.m1.1.1.1.1.4" xref="S2.E3.m1.1.1.1.1.4.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.1.1.1.1.4.2" xref="S2.E3.m1.1.1.1.1.4.2.cmml">ℳ</mi><mrow id="S2.E3.m1.1.1.1.1.4.3" xref="S2.E3.m1.1.1.1.1.4.3.cmml"><mi id="S2.E3.m1.1.1.1.1.4.3.2" xref="S2.E3.m1.1.1.1.1.4.3.2.cmml">t</mi><mo id="S2.E3.m1.1.1.1.1.4.3.1" xref="S2.E3.m1.1.1.1.1.4.3.1.cmml">+</mo><mn id="S2.E3.m1.1.1.1.1.4.3.3" xref="S2.E3.m1.1.1.1.1.4.3.3.cmml">1</mn></mrow></msub><mo id="S2.E3.m1.1.1.1.1.3" xref="S2.E3.m1.1.1.1.1.3.cmml">=</mo><mrow id="S2.E3.m1.1.1.1.1.2" xref="S2.E3.m1.1.1.1.1.2.cmml"><msub id="S2.E3.m1.1.1.1.1.2.4" xref="S2.E3.m1.1.1.1.1.2.4.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.1.1.1.1.2.4.2" xref="S2.E3.m1.1.1.1.1.2.4.2.cmml">ℳ</mi><mi id="S2.E3.m1.1.1.1.1.2.4.3" xref="S2.E3.m1.1.1.1.1.2.4.3.cmml">t</mi></msub><mo id="S2.E3.m1.1.1.1.1.2.3" xref="S2.E3.m1.1.1.1.1.2.3.cmml">∪</mo><mrow id="S2.E3.m1.1.1.1.1.2.2.2" xref="S2.E3.m1.1.1.1.1.2.2.3.cmml"><mo stretchy="false" id="S2.E3.m1.1.1.1.1.2.2.2.3" xref="S2.E3.m1.1.1.1.1.2.2.3.cmml">(</mo><msub id="S2.E3.m1.1.1.1.1.1.1.1.1" xref="S2.E3.m1.1.1.1.1.1.1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.1.1.1.1.1.1.1.1.2" xref="S2.E3.m1.1.1.1.1.1.1.1.1.2.cmml">ℐ</mi><mrow id="S2.E3.m1.1.1.1.1.1.1.1.1.3" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3.cmml"><mi id="S2.E3.m1.1.1.1.1.1.1.1.1.3.2" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3.2.cmml">t</mi><mo id="S2.E3.m1.1.1.1.1.1.1.1.1.3.1" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3.1.cmml">+</mo><mn id="S2.E3.m1.1.1.1.1.1.1.1.1.3.3" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3.3.cmml">1</mn></mrow></msub><mo id="S2.E3.m1.1.1.1.1.2.2.2.4" xref="S2.E3.m1.1.1.1.1.2.2.3.cmml">,</mo><msub id="S2.E3.m1.1.1.1.1.2.2.2.2" xref="S2.E3.m1.1.1.1.1.2.2.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.1.1.1.1.2.2.2.2.2" xref="S2.E3.m1.1.1.1.1.2.2.2.2.2.cmml">𝒜</mi><mrow id="S2.E3.m1.1.1.1.1.2.2.2.2.3" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3.cmml"><mi id="S2.E3.m1.1.1.1.1.2.2.2.2.3.2" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3.2.cmml">t</mi><mo id="S2.E3.m1.1.1.1.1.2.2.2.2.3.1" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3.1.cmml">+</mo><mn id="S2.E3.m1.1.1.1.1.2.2.2.2.3.3" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3.3.cmml">1</mn></mrow></msub><mo stretchy="false" id="S2.E3.m1.1.1.1.1.2.2.2.5" xref="S2.E3.m1.1.1.1.1.2.2.3.cmml">)</mo></mrow></mrow></mrow><mspace width="2em" id="S2.E3.m1.2.2.2.3" xref="S2.E3.m1.2.2.3a.cmml"></mspace><mrow id="S2.E3.m1.2.2.2.2" xref="S2.E3.m1.2.2.2.2.cmml"><msub id="S2.E3.m1.2.2.2.2.4" xref="S2.E3.m1.2.2.2.2.4.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.2.2.2.2.4.2" xref="S2.E3.m1.2.2.2.2.4.2.cmml">𝒮</mi><mrow id="S2.E3.m1.2.2.2.2.4.3" xref="S2.E3.m1.2.2.2.2.4.3.cmml"><mi id="S2.E3.m1.2.2.2.2.4.3.2" xref="S2.E3.m1.2.2.2.2.4.3.2.cmml">t</mi><mo id="S2.E3.m1.2.2.2.2.4.3.1" xref="S2.E3.m1.2.2.2.2.4.3.1.cmml">+</mo><mn id="S2.E3.m1.2.2.2.2.4.3.3" xref="S2.E3.m1.2.2.2.2.4.3.3.cmml">1</mn></mrow></msub><mo id="S2.E3.m1.2.2.2.2.3" xref="S2.E3.m1.2.2.2.2.3.cmml">=</mo><mrow id="S2.E3.m1.2.2.2.2.2" xref="S2.E3.m1.2.2.2.2.2.cmml"><msub id="S2.E3.m1.2.2.2.2.2.4" xref="S2.E3.m1.2.2.2.2.2.4.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.2.2.2.2.2.4.2" xref="S2.E3.m1.2.2.2.2.2.4.2.cmml">𝒮</mi><mi id="S2.E3.m1.2.2.2.2.2.4.3" xref="S2.E3.m1.2.2.2.2.2.4.3.cmml">t</mi></msub><mo id="S2.E3.m1.2.2.2.2.2.3" xref="S2.E3.m1.2.2.2.2.2.3.cmml">∪</mo><mrow id="S2.E3.m1.2.2.2.2.2.2" xref="S2.E3.m1.2.2.2.2.2.2.cmml"><mi id="S2.E3.m1.2.2.2.2.2.2.4" xref="S2.E3.m1.2.2.2.2.2.2.4.cmml">ψ</mi><mo lspace="0em" rspace="0em" id="S2.E3.m1.2.2.2.2.2.2.3" xref="S2.E3.m1.2.2.2.2.2.2.3.cmml">​</mo><mrow id="S2.E3.m1.2.2.2.2.2.2.2.2" xref="S2.E3.m1.2.2.2.2.2.2.2.3.cmml"><mo stretchy="false" id="S2.E3.m1.2.2.2.2.2.2.2.2.3" xref="S2.E3.m1.2.2.2.2.2.2.2.3.cmml">(</mo><msub id="S2.E3.m1.2.2.2.2.1.1.1.1.1" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.2.2.2.2.1.1.1.1.1.2" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.2.cmml">ℐ</mi><mrow id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.cmml"><mi id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.2" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.2.cmml">t</mi><mo id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.1" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.1.cmml">+</mo><mn id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.3" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.3.cmml">1</mn></mrow></msub><mo id="S2.E3.m1.2.2.2.2.2.2.2.2.4" xref="S2.E3.m1.2.2.2.2.2.2.2.3.cmml">,</mo><msub id="S2.E3.m1.2.2.2.2.2.2.2.2.2" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.cmml"><mi class="ltx_font_mathcaligraphic" id="S2.E3.m1.2.2.2.2.2.2.2.2.2.2" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.2.cmml">𝒜</mi><mrow id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.cmml"><mi id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.2" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.2.cmml">t</mi><mo id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.1" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.1.cmml">+</mo><mn id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.3" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.3.cmml">1</mn></mrow></msub><mo stretchy="false" id="S2.E3.m1.2.2.2.2.2.2.2.2.5" xref="S2.E3.m1.2.2.2.2.2.2.2.3.cmml">)</mo></mrow></mrow></mrow></mrow></mrow><annotation-xml encoding="MathML-Content" id="S2.E3.m1.2b"><apply id="S2.E3.m1.2.2.3.cmml" xref="S2.E3.m1.2.2.2"><csymbol cd="ambiguous" id="S2.E3.m1.2.2.3a.cmml" xref="S2.E3.m1.2.2.2.3">formulae-sequence</csymbol><apply id="S2.E3.m1.1.1.1.1.cmml" xref="S2.E3.m1.1.1.1.1"><eq id="S2.E3.m1.1.1.1.1.3.cmml" xref="S2.E3.m1.1.1.1.1.3"></eq><apply id="S2.E3.m1.1.1.1.1.4.cmml" xref="S2.E3.m1.1.1.1.1.4"><csymbol cd="ambiguous" id="S2.E3.m1.1.1.1.1.4.1.cmml" xref="S2.E3.m1.1.1.1.1.4">subscript</csymbol><ci id="S2.E3.m1.1.1.1.1.4.2.cmml" xref="S2.E3.m1.1.1.1.1.4.2">ℳ</ci><apply id="S2.E3.m1.1.1.1.1.4.3.cmml" xref="S2.E3.m1.1.1.1.1.4.3"><plus id="S2.E3.m1.1.1.1.1.4.3.1.cmml" xref="S2.E3.m1.1.1.1.1.4.3.1"></plus><ci id="S2.E3.m1.1.1.1.1.4.3.2.cmml" xref="S2.E3.m1.1.1.1.1.4.3.2">𝑡</ci><cn type="integer" id="S2.E3.m1.1.1.1.1.4.3.3.cmml" xref="S2.E3.m1.1.1.1.1.4.3.3">1</cn></apply></apply><apply id="S2.E3.m1.1.1.1.1.2.cmml" xref="S2.E3.m1.1.1.1.1.2"><union id="S2.E3.m1.1.1.1.1.2.3.cmml" xref="S2.E3.m1.1.1.1.1.2.3"></union><apply id="S2.E3.m1.1.1.1.1.2.4.cmml" xref="S2.E3.m1.1.1.1.1.2.4"><csymbol cd="ambiguous" id="S2.E3.m1.1.1.1.1.2.4.1.cmml" xref="S2.E3.m1.1.1.1.1.2.4">subscript</csymbol><ci id="S2.E3.m1.1.1.1.1.2.4.2.cmml" xref="S2.E3.m1.1.1.1.1.2.4.2">ℳ</ci><ci id="S2.E3.m1.1.1.1.1.2.4.3.cmml" xref="S2.E3.m1.1.1.1.1.2.4.3">𝑡</ci></apply><interval closure="open" id="S2.E3.m1.1.1.1.1.2.2.3.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2"><apply id="S2.E3.m1.1.1.1.1.1.1.1.1.cmml" xref="S2.E3.m1.1.1.1.1.1.1.1.1"><csymbol cd="ambiguous" id="S2.E3.m1.1.1.1.1.1.1.1.1.1.cmml" xref="S2.E3.m1.1.1.1.1.1.1.1.1">subscript</csymbol><ci id="S2.E3.m1.1.1.1.1.1.1.1.1.2.cmml" xref="S2.E3.m1.1.1.1.1.1.1.1.1.2">ℐ</ci><apply id="S2.E3.m1.1.1.1.1.1.1.1.1.3.cmml" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3"><plus id="S2.E3.m1.1.1.1.1.1.1.1.1.3.1.cmml" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3.1"></plus><ci id="S2.E3.m1.1.1.1.1.1.1.1.1.3.2.cmml" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3.2">𝑡</ci><cn type="integer" id="S2.E3.m1.1.1.1.1.1.1.1.1.3.3.cmml" xref="S2.E3.m1.1.1.1.1.1.1.1.1.3.3">1</cn></apply></apply><apply id="S2.E3.m1.1.1.1.1.2.2.2.2.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2.2"><csymbol cd="ambiguous" id="S2.E3.m1.1.1.1.1.2.2.2.2.1.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2.2">subscript</csymbol><ci id="S2.E3.m1.1.1.1.1.2.2.2.2.2.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2.2.2">𝒜</ci><apply id="S2.E3.m1.1.1.1.1.2.2.2.2.3.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3"><plus id="S2.E3.m1.1.1.1.1.2.2.2.2.3.1.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3.1"></plus><ci id="S2.E3.m1.1.1.1.1.2.2.2.2.3.2.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3.2">𝑡</ci><cn type="integer" id="S2.E3.m1.1.1.1.1.2.2.2.2.3.3.cmml" xref="S2.E3.m1.1.1.1.1.2.2.2.2.3.3">1</cn></apply></apply></interval></apply></apply><apply id="S2.E3.m1.2.2.2.2.cmml" xref="S2.E3.m1.2.2.2.2"><eq id="S2.E3.m1.2.2.2.2.3.cmml" xref="S2.E3.m1.2.2.2.2.3"></eq><apply id="S2.E3.m1.2.2.2.2.4.cmml" xref="S2.E3.m1.2.2.2.2.4"><csymbol cd="ambiguous" id="S2.E3.m1.2.2.2.2.4.1.cmml" xref="S2.E3.m1.2.2.2.2.4">subscript</csymbol><ci id="S2.E3.m1.2.2.2.2.4.2.cmml" xref="S2.E3.m1.2.2.2.2.4.2">𝒮</ci><apply id="S2.E3.m1.2.2.2.2.4.3.cmml" xref="S2.E3.m1.2.2.2.2.4.3"><plus id="S2.E3.m1.2.2.2.2.4.3.1.cmml" xref="S2.E3.m1.2.2.2.2.4.3.1"></plus><ci id="S2.E3.m1.2.2.2.2.4.3.2.cmml" xref="S2.E3.m1.2.2.2.2.4.3.2">𝑡</ci><cn type="integer" id="S2.E3.m1.2.2.2.2.4.3.3.cmml" xref="S2.E3.m1.2.2.2.2.4.3.3">1</cn></apply></apply><apply id="S2.E3.m1.2.2.2.2.2.cmml" xref="S2.E3.m1.2.2.2.2.2"><union id="S2.E3.m1.2.2.2.2.2.3.cmml" xref="S2.E3.m1.2.2.2.2.2.3"></union><apply id="S2.E3.m1.2.2.2.2.2.4.cmml" xref="S2.E3.m1.2.2.2.2.2.4"><csymbol cd="ambiguous" id="S2.E3.m1.2.2.2.2.2.4.1.cmml" xref="S2.E3.m1.2.2.2.2.2.4">subscript</csymbol><ci id="S2.E3.m1.2.2.2.2.2.4.2.cmml" xref="S2.E3.m1.2.2.2.2.2.4.2">𝒮</ci><ci id="S2.E3.m1.2.2.2.2.2.4.3.cmml" xref="S2.E3.m1.2.2.2.2.2.4.3">𝑡</ci></apply><apply id="S2.E3.m1.2.2.2.2.2.2.cmml" xref="S2.E3.m1.2.2.2.2.2.2"><times id="S2.E3.m1.2.2.2.2.2.2.3.cmml" xref="S2.E3.m1.2.2.2.2.2.2.3"></times><ci id="S2.E3.m1.2.2.2.2.2.2.4.cmml" xref="S2.E3.m1.2.2.2.2.2.2.4">𝜓</ci><interval closure="open" id="S2.E3.m1.2.2.2.2.2.2.2.3.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2"><apply id="S2.E3.m1.2.2.2.2.1.1.1.1.1.cmml" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1"><csymbol cd="ambiguous" id="S2.E3.m1.2.2.2.2.1.1.1.1.1.1.cmml" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1">subscript</csymbol><ci id="S2.E3.m1.2.2.2.2.1.1.1.1.1.2.cmml" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.2">ℐ</ci><apply id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.cmml" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3"><plus id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.1.cmml" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.1"></plus><ci id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.2.cmml" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.2">𝑡</ci><cn type="integer" id="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.3.cmml" xref="S2.E3.m1.2.2.2.2.1.1.1.1.1.3.3">1</cn></apply></apply><apply id="S2.E3.m1.2.2.2.2.2.2.2.2.2.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2"><csymbol cd="ambiguous" id="S2.E3.m1.2.2.2.2.2.2.2.2.2.1.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2">subscript</csymbol><ci id="S2.E3.m1.2.2.2.2.2.2.2.2.2.2.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.2">𝒜</ci><apply id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3"><plus id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.1.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.1"></plus><ci id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.2.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.2">𝑡</ci><cn type="integer" id="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.3.cmml" xref="S2.E3.m1.2.2.2.2.2.2.2.2.2.3.3">1</cn></apply></apply></interval></apply></apply></apply></apply></annotation-xml><annotation encoding="application/x-tex" id="S2.E3.m1.2c">\mathcal{M}_{t+1}=\mathcal{M}_{t}\cup(\mathcal{I}_{t+1},\mathcal{A}_{t+1})\qquad\mathcal{S}_{t+1}=\mathcal{S}_{t}\cup\psi(\mathcal{I}_{t+1},\mathcal{A}_{t+1})</annotation></semantics></math></td>
<td class="ltx_eqn_cell ltx_eqn_center_padright"></td>
<td rowspan="1" class="ltx_eqn_cell ltx_eqn_eqno ltx_align_middle ltx_align_right"><span class="ltx_tag ltx_tag_equation ltx_align_right">(3)</span></td>
</tr></tbody>
</table>
</div>
<div id="S2.SS2.p5" class="ltx_para ltx_noindent">
<p id="S2.SS2.p5.2" class="ltx_p">We establish communication protocols through prompts. For example, an ending message satisfying specific formatting requirements (e.g., “<math id="S2.SS2.p5.1.m1.1" class="ltx_Math" alttext="\textless" display="inline"><semantics id="S2.SS2.p5.1.m1.1a"><mo id="S2.SS2.p5.1.m1.1.1" xref="S2.SS2.p5.1.m1.1.1.cmml">&lt;</mo><annotation-xml encoding="MathML-Content" id="S2.SS2.p5.1.m1.1b"><lt id="S2.SS2.p5.1.m1.1.1.cmml" xref="S2.SS2.p5.1.m1.1.1"></lt></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p5.1.m1.1c">\textless</annotation></semantics></math>MODALITY<math id="S2.SS2.p5.2.m2.1" class="ltx_Math" alttext="\textgreater" display="inline"><semantics id="S2.SS2.p5.2.m2.1a"><mo id="S2.SS2.p5.2.m2.1.1" xref="S2.SS2.p5.2.m2.1.1.cmml">&gt;</mo><annotation-xml encoding="MathML-Content" id="S2.SS2.p5.2.m2.1b"><gt id="S2.SS2.p5.2.m2.1.1.cmml" xref="S2.SS2.p5.2.m2.1.1"></gt></annotation-xml><annotation encoding="application/x-tex" id="S2.SS2.p5.2.m2.1c">\textgreater</annotation></semantics></math>: Desktop Application”) is generated when both parties reach a consensus. The system monitors communication to ensure compliance with the designated format, allowing for the conclusion of the current dialogue.</p>
</div>
<figure id="S2.F3" class="ltx_figure">
<div class="ltx_flex_figure">
<div class="ltx_flex_cell ltx_flex_size_3">
<figure id="S2.F3.sf1" class="ltx_figure ltx_figure_panel ltx_align_center"><img src="/html/2307.07924/assets/figures/role_specialization.png" id="S2.F3.sf1.g1" class="ltx_graphics ltx_img_square" width="162" height="180" alt="Refer to caption">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_figure">(a) </span>Role Specialization</figcaption>
</figure>
</div>
<div class="ltx_flex_cell ltx_flex_size_3">
<figure id="S2.F3.sf2" class="ltx_figure ltx_figure_panel ltx_align_center"><img src="/html/2307.07924/assets/figures/memory_stream.png" id="S2.F3.sf2.g1" class="ltx_graphics ltx_img_square" width="162" height="159" alt="Refer to caption">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_figure">(b) </span>Memory Stream</figcaption>
</figure>
</div>
<div class="ltx_flex_cell ltx_flex_size_3">
<figure id="S2.F3.sf3" class="ltx_figure ltx_figure_panel ltx_align_center"><img src="/html/2307.07924/assets/figures/self_reflection.png" id="S2.F3.sf3.g1" class="ltx_graphics ltx_img_square" width="162" height="186" alt="Refer to caption">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_figure">(c) </span>Self-Reflection</figcaption>
</figure>
</div>
</div>
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 3: </span>Three key mechanisms utilized in each chat. Role specialization ensures that each agent fulfills their designated functions and contributes effectively to the task-oriented dialogue. The memory stream maintains a comprehensive record of previous dialogues within the chat, enabling agents to make informed decisions. Self-reflection prompts the assistant to reflect on proposed decisions when both parties reach a consensus without triggering predefined termination conditions.</figcaption>
</figure>
<div id="S2.SS2.p6" class="ltx_para ltx_noindent">
<p id="S2.SS2.p6.1" class="ltx_p"><span id="S2.SS2.p6.1.1" class="ltx_text ltx_font_bold">Self-Reflection</span>  Occasionally, we have observed dialogues where both parties reach a consensus but do not trigger the predefined communication protocols as termination conditions. In such cases, we introduce a <span id="S2.SS2.p6.1.2" class="ltx_text ltx_font_italic">self-reflection</span> mechanism, which involves extracting and retrieving memories. To implement this mechanism, we enlist a “pseudo self” as a new questioner and initiate a fresh chat. The pseudo questioner informs the current assistant of all the historical records from previous dialogues and requests a summary of the conclusive information from the dialogue, as shown in Figure <a href="#S2.F3.sf3" title="In Figure 3 ‣ 2.2 Designing ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">3(c)</span></a>. This mechanism effectively encourages the assistant to reflect upon the decisions proposed and discussed during the dialogue.</p>
</div>
</section>
<section id="S2.SS3" class="ltx_subsection">
<h3 class="ltx_title ltx_title_subsection">
<span class="ltx_tag ltx_tag_subsection">2.3 </span>Coding</h3>

<div id="S2.SS3.p1" class="ltx_para ltx_noindent">
<p id="S2.SS3.p1.1" class="ltx_p">The coding phase involves three predefined roles: CTO, programmer, and art designer. The chat chain decomposes the coding phase into sequential atomic chatting tasks, such as generating complete codes (CTO and programmer) and devising a graphical user interface (designer and programmer).
Based on the main designs discussed in the previous phase, the CTO instructs the programmer to implement a software system using markdown format. The programmer generates codes in response and extracts the corresponding codes based on markdown format. The designer proposes a user-friendly graphical user interface (GUI) that uses graphical icons for user interaction instead of text-based commands. Then, the designer creates visually appealing graphics using external text-to-image tools <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib35" title="" class="ltx_ref">35</a>]</cite>, which the programmer incorporates into the GUI design using standard toolkits.</p>
</div>
<div id="S2.SS3.p2" class="ltx_para ltx_noindent">
<p id="S2.SS3.p2.1" class="ltx_p"><span id="S2.SS3.p2.1.1" class="ltx_text ltx_font_bold">Code Management</span>  To handle complex software systems, ChatDev utilizes object-oriented programming languages like Python. The modularity of object-oriented programming allows for self-contained objects, aiding troubleshooting and collaborative development. Reusability enables code reuse through inheritance, reducing redundancy. We introduce the “version evolution” mechanism to restrict visibility to the latest code version between roles, discarding earlier code versions from the memory stream. The programmer manages the project using Git-related commands. Proposed code modifications and changes increment the software version by 1.0. Version evolution gradually eliminates code hallucinations. The combination of object-oriented programming and version evolution is suitable for dialogues involving long code segments.</p>
</div>
<figure id="S2.F4" class="ltx_figure">
<div class="ltx_flex_figure">
<div class="ltx_flex_cell ltx_flex_size_2">
<figure id="S2.F4.sf1" class="ltx_figure ltx_figure_panel ltx_align_center"><img src="/html/2307.07924/assets/figures/naive_instruction.png" id="S2.F4.sf1.g1" class="ltx_graphics ltx_img_landscape" width="154" height="104" alt="Refer to caption">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_figure">(a) </span>Naive Instruction in Coding</figcaption>
</figure>
</div>
<div class="ltx_flex_cell ltx_flex_size_2">
<figure id="S2.F4.sf2" class="ltx_figure ltx_figure_panel ltx_align_center"><img src="/html/2307.07924/assets/figures/thought_instruction.png" id="S2.F4.sf2.g1" class="ltx_graphics ltx_img_landscape" width="333" height="104" alt="Refer to caption">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_figure">(b) </span>Thought Instruction in Coding</figcaption>
</figure>
</div>
<div class="ltx_flex_break"></div>
<div class="ltx_flex_cell ltx_flex_size_2">
<figure id="S2.F4.sf3" class="ltx_figure ltx_figure_panel ltx_align_center"><img src="/html/2307.07924/assets/figures/naive_instruction_testing.png" id="S2.F4.sf3.g1" class="ltx_graphics ltx_img_square" width="155" height="131" alt="Refer to caption">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_figure">(c) </span>Naive Instruction in Testing</figcaption>
</figure>
</div>
<div class="ltx_flex_cell ltx_flex_size_2">
<figure id="S2.F4.sf4" class="ltx_figure ltx_figure_panel ltx_align_center"><img src="/html/2307.07924/assets/figures/thought_instruction_testing.png" id="S2.F4.sf4.g1" class="ltx_graphics ltx_img_landscape" width="338" height="131" alt="Refer to caption">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_figure">(d) </span>Thought Instruction in Testing</figcaption>
</figure>
</div>
</div>
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 4: </span>The thought instruction mitigates code hallucinations during the coding and testing phases. Instead of providing generic instructions, thought instruction involves role swapping to inquire about unimplemented methods or explain feedback messages caused by bugs. This step allows for a clearer understanding of the existing code and identifies the specific gaps that need to be addressed. By gaining this awareness, the roles can then switch back, and the instructor can provide more specific instructions to guide the programmer accurately.</figcaption>
</figure>
<div id="S2.SS3.p3" class="ltx_para ltx_noindent">
<p id="S2.SS3.p3.1" class="ltx_p"><span id="S2.SS3.p3.1.1" class="ltx_text ltx_font_bold">Thought Instruction</span>  Traditional question answering can lead to inaccuracies or irrelevant information, especially in code generation, where naive instructions may result in unexpected hallucinations.
This issue becomes particularly problematic when generating code. For instance, when instructing the programmer to implement all unimplemented methods, a naive instruction may result in hallucinations, such as including methods that are reserved as unimplemented interfaces.
To address this, we propose the “<span id="S2.SS3.p3.1.2" class="ltx_text ltx_font_italic">thought instruction</span>” mechanism, inspired by chain-of-thought prompting <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib44" title="" class="ltx_ref">44</a>]</cite>. It involves explicitly addressing specific problem-solving thoughts in instructions, akin to solving subtasks in a sequential manner.
As shown in Figure <a href="#S2.F4.sf1" title="In Figure 4 ‣ 2.3 Coding ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">4(a)</span></a> and <a href="#S2.F4.sf2" title="In Figure 4 ‣ 2.3 Coding ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">4(b)</span></a>, thought instruction includes swapping roles to inquire about which methods are not yet implemented and then switching back to provide the programmer with more precise instructions to follow.
By incorporating thought instruction, the coding process becomes more focused and targeted. The explicit expression of specific thoughts in the instructions helps to reduce ambiguity and ensures that the generated code aligns with the intended objectives. This mechanism enables a more accurate and context-aware approach to code completion, minimizing the occurrence of hallucination and resulting in more reliable and comprehensive code outputs.</p>
</div>
</section>
<section id="S2.SS4" class="ltx_subsection">
<h3 class="ltx_title ltx_title_subsection">
<span class="ltx_tag ltx_tag_subsection">2.4 </span>Testing</h3>

<div id="S2.SS4.p1" class="ltx_para ltx_noindent">
<p id="S2.SS4.p1.1" class="ltx_p">Even for human programmers, there is no guarantee that the code they write on the first attempt is always error-free.
Rather than discarding incorrect code outright, humans typically analyze and investigate code execution results to identify and rectify implementation errors <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib8" title="" class="ltx_ref">8</a>]</cite>.
In ChatDev, the testing phase involves three roles: programmer, reviewer, and tester. The process consists of sequential atomic chatting tasks, including peer review (programmer and reviewer) and system testing (programmer and tester). Peer review, or static debugging, examines source code to identify potential issues. System testing, a form of dynamic debugging, verifies software execution through tests conducted by the programmer using an interpreter. This testing focuses on evaluating application performance through black-box testing.</p>
</div>
<div id="S2.SS4.p2" class="ltx_para ltx_noindent">
<p id="S2.SS4.p2.1" class="ltx_p">In our practice, we observed that allowing two agents to communicate solely based on feedback messages from an interpreter does not result in a bug-free system. The programmer’s modifications may not strictly follow the feedback, leading to hallucinations. To address this, we further employ the thought instruction mechanism to explicitly express debugging thoughts in the instructions (Figure <a href="#S2.F4.sf3" title="In Figure 4 ‣ 2.3 Coding ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">4(c)</span></a> and <a href="#S2.F4.sf4" title="In Figure 4 ‣ 2.3 Coding ‣ 2 ChatDev ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">4(d)</span></a>). The tester executes the software, analyzes bugs, proposes modifications, and instructs the programmer accordingly. This iterative process continues until potential bugs are eliminated and the system runs successfully.</p>
</div>
<div id="S2.SS4.p3" class="ltx_para ltx_noindent">
<p id="S2.SS4.p3.1" class="ltx_p">In cases where an interpreter struggles with identifying fine-grained logical issues, the involvement of a human client in software testing becomes optional. ChatDev enables the human client to provide feedback and suggestions in natural language, similar to a reviewer or tester, using black-box testing or other strategies. ChatDev, based on human input, can understand and utilize this feedback to refine the software system.</p>
</div>
</section>
<section id="S2.SS5" class="ltx_subsection">
<h3 class="ltx_title ltx_title_subsection">
<span class="ltx_tag ltx_tag_subsection">2.5 </span>Documenting</h3>

<div id="S2.SS5.p1" class="ltx_para ltx_noindent">
<p id="S2.SS5.p1.1" class="ltx_p">After the designing, coding, and testing phases, ChatDev employs four agents (CEO, CPO, CTO, and programmer) to generate software project documentation. Using large language models, we leverage few-shot prompting <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib5" title="" class="ltx_ref">5</a>]</cite> with in-context examples for document generation. The CTO instructs the programmer to provide configuration instructions for environmental dependencies, resulting in a document like <span id="S2.SS5.p1.1.1" class="ltx_text ltx_font_typewriter">requirements.txt</span>. This document allows users to configure the environment independently. Simultaneously, the CEO communicates requirements and system design to the CPO, who generates a user manual.</p>
</div>
<figure id="S2.F5" class="ltx_figure"><img src="/html/2307.07924/assets/figures/documenting.png" id="S2.F5.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="592" height="125" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 5: </span>The documenting phase involves generating relevant documents, such as external dependency specifications and user instructions. The user manual provides comprehensive information about the software’s technical architecture, installation instructions, and features, serving as a valuable resource for users. Once the dependencies are installed, a human client can execute the software using a suitable interpreter.</figcaption>
</figure>
</section>
</section>
<section id="S3" class="ltx_section">
<h2 class="ltx_title ltx_title_section">
<span class="ltx_tag ltx_tag_section">3 </span>Experiments</h2>

<div id="S3.p1" class="ltx_para ltx_noindent">
<p id="S3.p1.1" class="ltx_p">Our experimental setup employs the “<span id="S3.p1.1.1" class="ltx_text ltx_font_typewriter">ChatGPT-turbo-16k</span>” version of ChatGPT to simulate multi-agent software development. The language model temperature is set to 0.2 for controlled generation. In the coding phase, we allow a maximum of 5 attempts for code completion. The reviewer is permitted 5 chats to propose modifications, and a maximum of 5 software system tests are conducted in the testing phase.
For Python-based systems, we use Python 3.8.16 as the interpreter for testing.
Camel <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib23" title="" class="ltx_ref">23</a>]</cite> has curated an instruction-following dialogue dataset, which spans across 20 programming languages, 50 domains, and 50 tasks per domain.
From this extensive task set, we randomly selected 70 tasks<span id="footnote1" class="ltx_note ltx_role_footnote"><sup class="ltx_note_mark">1</sup><span class="ltx_note_outer"><span class="ltx_note_content"><sup class="ltx_note_mark">1</sup><span class="ltx_tag ltx_tag_note">1</span>For exmaple, “<span id="footnote1.1" class="ltx_text ltx_font_italic">Implement a Gomoku game using Python, incorporating an AI opponent with varying difficulty levels</span>” or “<span id="footnote1.2" class="ltx_text ltx_font_italic">Create a Python program to develop an interactive weather dashboard</span>”.</span></span></span>, including both specific and relatively abstract cases, to serve as the basis for analysis in our ChatDev software development.</p>
</div>
<div id="S3.p2" class="ltx_para ltx_noindent">
<p id="S3.p2.1" class="ltx_p"><span id="S3.p2.1.1" class="ltx_text ltx_font_bold">Software Statistics</span>  We performed a statistical analysis on the software systems generated by ChatDev. Key metrics, including the total dialogue turns, consumed tokens, software files, image assets, and version updates, were examined. Table <a href="#S3.T1" title="Table 1 ‣ 3 Experiments ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">1</span></a> presents these metrics, providing valuable insights into the communication-based software development process. It offers a comprehensive overview of ChatDev’s development, covering aspects such as versioning, file composition, code complexity, and development iterations.</p>
</div>
<figure id="S3.T1" class="ltx_table">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_table">Table 1: </span>The statistical analysis of ChatDev’s software development, including minimum (Min), maximum (Max), and average (Avg.) values for various aspects.</figcaption>
<table id="S3.T1.1" class="ltx_tabular ltx_centering ltx_guessed_headers ltx_align_middle">
<thead class="ltx_thead">
<tr id="S3.T1.1.1.1" class="ltx_tr">
<th id="S3.T1.1.1.1.1" class="ltx_td ltx_th ltx_th_row ltx_border_tt"></th>
<th id="S3.T1.1.1.1.2" class="ltx_td ltx_align_right ltx_th ltx_th_column ltx_border_tt"><span id="S3.T1.1.1.1.2.1" class="ltx_text" style="background-color:#FFFFFF;">Min</span></th>
<th id="S3.T1.1.1.1.3" class="ltx_td ltx_align_right ltx_th ltx_th_column ltx_border_tt"><span id="S3.T1.1.1.1.3.1" class="ltx_text" style="background-color:#FFFFFF;">Max</span></th>
<th id="S3.T1.1.1.1.4" class="ltx_td ltx_align_right ltx_th ltx_th_column ltx_border_tt"><span id="S3.T1.1.1.1.4.1" class="ltx_text" style="background-color:#FFFFFF;">Avg.</span></th>
</tr>
</thead>
<tbody class="ltx_tbody">
<tr id="S3.T1.1.2.1" class="ltx_tr" style="background-color:#F2F2F2;">
<th id="S3.T1.1.2.1.1" class="ltx_td ltx_align_left ltx_th ltx_th_row ltx_border_t"><span id="S3.T1.1.2.1.1.1" class="ltx_text" style="background-color:#F2F2F2;"># Code Files</span></th>
<td id="S3.T1.1.2.1.2" class="ltx_td ltx_align_right ltx_border_t"><span id="S3.T1.1.2.1.2.1" class="ltx_text" style="background-color:#F2F2F2;">2.00</span></td>
<td id="S3.T1.1.2.1.3" class="ltx_td ltx_align_right ltx_border_t"><span id="S3.T1.1.2.1.3.1" class="ltx_text" style="background-color:#F2F2F2;">8.00</span></td>
<td id="S3.T1.1.2.1.4" class="ltx_td ltx_align_right ltx_border_t"><span id="S3.T1.1.2.1.4.1" class="ltx_text" style="background-color:#F2F2F2;">4.26</span></td>
</tr>
<tr id="S3.T1.1.3.2" class="ltx_tr" style="background-color:#FFFFFF;">
<th id="S3.T1.1.3.2.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T1.1.3.2.1.1" class="ltx_text" style="background-color:#FFFFFF;"># Asset Files</span></th>
<td id="S3.T1.1.3.2.2" class="ltx_td ltx_align_right"><span id="S3.T1.1.3.2.2.1" class="ltx_text" style="background-color:#FFFFFF;">0.00</span></td>
<td id="S3.T1.1.3.2.3" class="ltx_td ltx_align_right"><span id="S3.T1.1.3.2.3.1" class="ltx_text" style="background-color:#FFFFFF;">21.00</span></td>
<td id="S3.T1.1.3.2.4" class="ltx_td ltx_align_right"><span id="S3.T1.1.3.2.4.1" class="ltx_text" style="background-color:#FFFFFF;">8.74</span></td>
</tr>
<tr id="S3.T1.1.4.3" class="ltx_tr" style="background-color:#F2F2F2;">
<th id="S3.T1.1.4.3.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T1.1.4.3.1.1" class="ltx_text" style="background-color:#F2F2F2;"># Document Files</span></th>
<td id="S3.T1.1.4.3.2" class="ltx_td ltx_align_right"><span id="S3.T1.1.4.3.2.1" class="ltx_text" style="background-color:#F2F2F2;">4.00</span></td>
<td id="S3.T1.1.4.3.3" class="ltx_td ltx_align_right"><span id="S3.T1.1.4.3.3.1" class="ltx_text" style="background-color:#F2F2F2;">5.00</span></td>
<td id="S3.T1.1.4.3.4" class="ltx_td ltx_align_right"><span id="S3.T1.1.4.3.4.1" class="ltx_text" style="background-color:#F2F2F2;">4.04</span></td>
</tr>
<tr id="S3.T1.1.5.4" class="ltx_tr" style="background-color:#FFFFFF;">
<th id="S3.T1.1.5.4.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T1.1.5.4.1.1" class="ltx_text" style="background-color:#FFFFFF;"># Lines of Source Codes</span></th>
<td id="S3.T1.1.5.4.2" class="ltx_td ltx_align_right"><span id="S3.T1.1.5.4.2.1" class="ltx_text" style="background-color:#FFFFFF;">39.00</span></td>
<td id="S3.T1.1.5.4.3" class="ltx_td ltx_align_right"><span id="S3.T1.1.5.4.3.1" class="ltx_text" style="background-color:#FFFFFF;">359.00</span></td>
<td id="S3.T1.1.5.4.4" class="ltx_td ltx_align_right"><span id="S3.T1.1.5.4.4.1" class="ltx_text" style="background-color:#FFFFFF;">131.61</span></td>
</tr>
<tr id="S3.T1.1.6.5" class="ltx_tr" style="background-color:#F2F2F2;">
<th id="S3.T1.1.6.5.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T1.1.6.5.1.1" class="ltx_text" style="background-color:#F2F2F2;"># Lines of Dependencies</span></th>
<td id="S3.T1.1.6.5.2" class="ltx_td ltx_align_right"><span id="S3.T1.1.6.5.2.1" class="ltx_text" style="background-color:#F2F2F2;">1.00</span></td>
<td id="S3.T1.1.6.5.3" class="ltx_td ltx_align_right"><span id="S3.T1.1.6.5.3.1" class="ltx_text" style="background-color:#F2F2F2;">5.00</span></td>
<td id="S3.T1.1.6.5.4" class="ltx_td ltx_align_right"><span id="S3.T1.1.6.5.4.1" class="ltx_text" style="background-color:#F2F2F2;">2.90</span></td>
</tr>
<tr id="S3.T1.1.7.6" class="ltx_tr" style="background-color:#FFFFFF;">
<th id="S3.T1.1.7.6.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T1.1.7.6.1.1" class="ltx_text" style="background-color:#FFFFFF;"># Lines of User Manual</span></th>
<td id="S3.T1.1.7.6.2" class="ltx_td ltx_align_right"><span id="S3.T1.1.7.6.2.1" class="ltx_text" style="background-color:#FFFFFF;">31.00</span></td>
<td id="S3.T1.1.7.6.3" class="ltx_td ltx_align_right"><span id="S3.T1.1.7.6.3.1" class="ltx_text" style="background-color:#FFFFFF;">232.00</span></td>
<td id="S3.T1.1.7.6.4" class="ltx_td ltx_align_right"><span id="S3.T1.1.7.6.4.1" class="ltx_text" style="background-color:#FFFFFF;">53.96</span></td>
</tr>
<tr id="S3.T1.1.8.7" class="ltx_tr" style="background-color:#F2F2F2;">
<th id="S3.T1.1.8.7.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T1.1.8.7.1.1" class="ltx_text" style="background-color:#F2F2F2;"># Version Updates</span></th>
<td id="S3.T1.1.8.7.2" class="ltx_td ltx_align_right"><span id="S3.T1.1.8.7.2.1" class="ltx_text" style="background-color:#F2F2F2;">5.00</span></td>
<td id="S3.T1.1.8.7.3" class="ltx_td ltx_align_right"><span id="S3.T1.1.8.7.3.1" class="ltx_text" style="background-color:#F2F2F2;">42.00</span></td>
<td id="S3.T1.1.8.7.4" class="ltx_td ltx_align_right"><span id="S3.T1.1.8.7.4.1" class="ltx_text" style="background-color:#F2F2F2;">13.23</span></td>
</tr>
<tr id="S3.T1.1.9.8" class="ltx_tr" style="background-color:#FFFFFF;">
<th id="S3.T1.1.9.8.1" class="ltx_td ltx_align_left ltx_th ltx_th_row ltx_border_bb"><span id="S3.T1.1.9.8.1.1" class="ltx_text" style="background-color:#FFFFFF;"># Software Re-development</span></th>
<td id="S3.T1.1.9.8.2" class="ltx_td ltx_align_right ltx_border_bb"><span id="S3.T1.1.9.8.2.1" class="ltx_text" style="background-color:#FFFFFF;">1.00</span></td>
<td id="S3.T1.1.9.8.3" class="ltx_td ltx_align_right ltx_border_bb"><span id="S3.T1.1.9.8.3.1" class="ltx_text" style="background-color:#FFFFFF;">5.00</span></td>
<td id="S3.T1.1.9.8.4" class="ltx_td ltx_align_right ltx_border_bb"><span id="S3.T1.1.9.8.4.1" class="ltx_text" style="background-color:#FFFFFF;">1.40</span></td>
</tr>
</tbody>
</table>
</figure>
<div id="S3.p3" class="ltx_para ltx_noindent">
<p id="S3.p3.1" class="ltx_p">The generated software typically includes 2 to 8 code files, with an average of 4.26 files.
Asset files, created by the art designer using external tools <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib35" title="" class="ltx_ref">35</a>]</cite>, range from 0 to 21, with an average of 8.74 files.
Here are some examples of concise text descriptions through which programmers request the designer to create images, such as “<span id="S3.p3.1.1" class="ltx_text ltx_font_typewriter">The text entry field where the user can input their data</span>”, “<span id="S3.p3.1.2" class="ltx_text ltx_font_typewriter">The background image for the financial dashboard</span>”, and “<span id="S3.p3.1.3" class="ltx_text ltx_font_typewriter">The image representing the player character in the game</span>”.
The software is accompanied by 4 to 5 document files on average, such as dependency requirements specifications, user manuals, development logs, and software meta information.</p>
</div>
<div id="S3.p4" class="ltx_para ltx_noindent">
<p id="S3.p4.1" class="ltx_p">The software developed by ChatDev typically ranges from 39 to 359 lines of code, with an average of 131.61 lines<span id="footnote2" class="ltx_note ltx_role_footnote"><sup class="ltx_note_mark">2</sup><span class="ltx_note_outer"><span class="ltx_note_content"><sup class="ltx_note_mark">2</sup><span class="ltx_tag ltx_tag_note">2</span>This count includes only lines that contain meaningful code, excluding blank lines.</span></span></span>.
The data suggests that ChatDev tends to produce software with relatively small-scale code. This is partly because the design of object-oriented programming, whose reusability enables code reuse through inheritance, reducing redundancy.
We also noted that when the user specified a less specific task, the resulting source code generated by ChatDev tended to be shorter, averaging around 110.97 lines. This is primarily attributed to ChatDev employing high-level logic to fulfill non-specific tasks, often generating code that focuses on providing print information for interface representation.
Therefore, we recommend providing ChatDev with specific instructions, such as desired software features, system rules, UI design, and other detailed specifications. By providing clearer and more specific instructions, users can guide ChatDev to produce more comprehensive and tailored codes that aligns with their specific requirements.
The number of environment dependencies, which indicates the external software components required, ranges from 1 to 5, with an average of 2.90 dependencies. ChatDev’s software environment typically includes <span id="S3.p4.1.1" class="ltx_text ltx_font_typewriter">numpy</span>, <span id="S3.p4.1.2" class="ltx_text ltx_font_typewriter">matplotlib</span>, <span id="S3.p4.1.3" class="ltx_text ltx_font_typewriter">pandas</span>, <span id="S3.p4.1.4" class="ltx_text ltx_font_typewriter">tkinter</span>, <span id="S3.p4.1.5" class="ltx_text ltx_font_typewriter">pillow</span>, or <span id="S3.p4.1.6" class="ltx_text ltx_font_typewriter">flask</span>.
The user manual for the software consists of 31 to 232 lines, with an average of 53.96 lines. Based on our experience, the user manual commonly covers sections such as <span id="S3.p4.1.7" class="ltx_text ltx_font_typewriter">Introduction</span>, <span id="S3.p4.1.8" class="ltx_text ltx_font_typewriter">Quick Install</span>, <span id="S3.p4.1.9" class="ltx_text ltx_font_typewriter">Main Features</span>, <span id="S3.p4.1.10" class="ltx_text ltx_font_typewriter">Usage Instructions</span>, etc,.</p>
</div>
<div id="S3.p5" class="ltx_para ltx_noindent">
<p id="S3.p5.1" class="ltx_p">The number of version updates for the software ranges from 5 to 42, with an average of 13.23 updates. This indicates that the source code undergoes approximately 13 modifications on average, reflecting the collaborative effort among agents in alleviating code hallucination issues throughout the software development process, including code completion, coding, and testing.
In exceptional cases where the software fails to pass the maximum number of tests, ChatDev takes proactive measures by engaging in full-scale software re-engineering. In most cases, the software development process involves 1 to 5 development cycles, with an average of 1.40 cycles.</p>
</div>
<div id="S3.p6" class="ltx_para ltx_noindent">
<p id="S3.p6.1" class="ltx_p">In our experiments, we effortlessly set up the sandbox environment by directly installing the required software dependencies. Subsequently, we executed the generated software using the main function. Remarkably, approximately 86.66% of the software systems executed flawlessly, showcasing the robustness and reliability of our developed software. However, a small fraction, 13.33% of the software, encountered execution failures.
Upon analyzing the failed software creations, we identified two primary contributing factors. Firstly, in 50% of the cases, the failure was attributed to the token length limit of the API. This limitation prevented obtaining the complete source code within the specified length constraint for code generation. Such challenges are particularly evident when dealing with complex software systems or scenarios requiring extensive code generation.
The remaining 50% of the failed software creations were primarily affected by external dependency issues. These challenges emerged when certain dependencies were either unavailable in the cloud or incorrectly versioned, resulting in conflicts and unavailability of specific application programming interfaces (APIs) in the current version. These external dependency-related issues underscore the significance of meticulous management and coordination of the required software components to ensure smooth execution and functionality.
Overall, despite encountering a small percentage of failures, our experimental findings demonstrate the feasibility and effectiveness of ChatDev in generating executable software systems, with the majority of the systems successfully executing.</p>
</div>
<div id="S3.p7" class="ltx_para ltx_noindent">
<p id="S3.p7.1" class="ltx_p"><span id="S3.p7.1.1" class="ltx_text ltx_font_bold">Duration Analysis</span>  We conducted a duration analysis to examine the software production time for different request prompts using ChatDev. The variability in development times across prompts reflects the varying complexity and clarity of the assigned tasks. The graph in Figure <a href="#S3.F6" title="Figure 6 ‣ 3 Experiments ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">6</span></a> provides a visual representation of this distribution.
The longest software production duration, represented by the tallest bar on the left side of the graph, was 1030.00 seconds. This extended time was due to extensive dialogue and communication between the reviewer and programmer, leading to a detailed modification scheme. In contrast, the shortest bar on the right end of the graph indicates a minimum software development time of 169.00 seconds. This shorter duration was attributed to the absence of significant bugs and fewer dialogues during coding and testing stages.
On average, the development of small-sized software and interfaces using ChatDev took 409.84 seconds, less than 7.00 minutes. In comparison, traditional custom software development cycles, even within agile software development methods, typically require 2 to 4 weeks or even several months per cycle <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib22" title="" class="ltx_ref">22</a>; <a href="#bib.bib10" title="" class="ltx_ref">10</a>]</cite>.</p>
</div>
<figure id="S3.F6" class="ltx_figure"><img src="/html/2307.07924/assets/figures/duration_distribution.png" id="S3.F6.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="419" height="242" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 6: </span>Duration Distribution. The bars in the graph are arranged in descending order, showcasing the distribution of software development runtime for different tasks.</figcaption>
</figure>
<div id="S3.p8" class="ltx_para ltx_noindent">
<p id="S3.p8.1" class="ltx_p"><span id="S3.p8.1.1" class="ltx_text ltx_font_bold">Dialogue Statistics</span> - In ChatDev, we employed a chat chain mechanism to facilitate software development. Each chat chain represents the production of software for a specific task and consists of multiple multi-utterance chat rounds. During these rounds, agents engage in discussions to address predefined subtasks, such as language choices, proposing solutions, and making final decisions. After completing all subtasks, a chat chain concludes with the development of the software product. For our case study tasks, we analyzed the chat chains and collected statistics, including the total number of utterances and prompt tokens used. These statistics are presented in Table <a href="#S3.T2" title="Table 2 ‣ 3 Experiments ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">2</span></a>.</p>
</div>
<figure id="S3.T2" class="ltx_table">
<figcaption class="ltx_caption"><span class="ltx_tag ltx_tag_table">Table 2: </span>The statistical analysis of all dialogues in chat chains.</figcaption>
<table id="S3.T2.1" class="ltx_tabular ltx_centering ltx_guessed_headers ltx_align_middle">
<thead class="ltx_thead">
<tr id="S3.T2.1.1.1" class="ltx_tr">
<th id="S3.T2.1.1.1.1" class="ltx_td ltx_th ltx_th_row ltx_border_tt"></th>
<th id="S3.T2.1.1.1.2" class="ltx_td ltx_align_right ltx_th ltx_th_column ltx_border_tt"><span id="S3.T2.1.1.1.2.1" class="ltx_text" style="background-color:#FFFFFF;">Min</span></th>
<th id="S3.T2.1.1.1.3" class="ltx_td ltx_align_right ltx_th ltx_th_column ltx_border_tt"><span id="S3.T2.1.1.1.3.1" class="ltx_text" style="background-color:#FFFFFF;">Max</span></th>
<th id="S3.T2.1.1.1.4" class="ltx_td ltx_align_right ltx_th ltx_th_column ltx_border_tt"><span id="S3.T2.1.1.1.4.1" class="ltx_text" style="background-color:#FFFFFF;">Avg.</span></th>
</tr>
</thead>
<tbody class="ltx_tbody">
<tr id="S3.T2.1.2.1" class="ltx_tr" style="background-color:#F2F2F2;">
<th id="S3.T2.1.2.1.1" class="ltx_td ltx_align_left ltx_th ltx_th_row ltx_border_t"><span id="S3.T2.1.2.1.1.1" class="ltx_text" style="background-color:#F2F2F2;"># Self-Reflection</span></th>
<td id="S3.T2.1.2.1.2" class="ltx_td ltx_align_right ltx_border_t"><span id="S3.T2.1.2.1.2.1" class="ltx_text" style="background-color:#F2F2F2;">1.00</span></td>
<td id="S3.T2.1.2.1.3" class="ltx_td ltx_align_right ltx_border_t"><span id="S3.T2.1.2.1.3.1" class="ltx_text" style="background-color:#F2F2F2;">4.00</span></td>
<td id="S3.T2.1.2.1.4" class="ltx_td ltx_align_right ltx_border_t"><span id="S3.T2.1.2.1.4.1" class="ltx_text" style="background-color:#F2F2F2;">1.24</span></td>
</tr>
<tr id="S3.T2.1.3.2" class="ltx_tr" style="background-color:#FFFFFF;">
<th id="S3.T2.1.3.2.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T2.1.3.2.1.1" class="ltx_text" style="background-color:#FFFFFF;"># Utterances</span></th>
<td id="S3.T2.1.3.2.2" class="ltx_td ltx_align_right"><span id="S3.T2.1.3.2.2.1" class="ltx_text" style="background-color:#FFFFFF;">24.00</span></td>
<td id="S3.T2.1.3.2.3" class="ltx_td ltx_align_right"><span id="S3.T2.1.3.2.3.1" class="ltx_text" style="background-color:#FFFFFF;">104.00</span></td>
<td id="S3.T2.1.3.2.4" class="ltx_td ltx_align_right"><span id="S3.T2.1.3.2.4.1" class="ltx_text" style="background-color:#FFFFFF;">45.60</span></td>
</tr>
<tr id="S3.T2.1.4.3" class="ltx_tr" style="background-color:#F2F2F2;">
<th id="S3.T2.1.4.3.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T2.1.4.3.1.1" class="ltx_text" style="background-color:#F2F2F2;"># Prompt Tokens</span></th>
<td id="S3.T2.1.4.3.2" class="ltx_td ltx_align_right"><span id="S3.T2.1.4.3.2.1" class="ltx_text" style="background-color:#F2F2F2;">11,119.00</span></td>
<td id="S3.T2.1.4.3.3" class="ltx_td ltx_align_right"><span id="S3.T2.1.4.3.3.1" class="ltx_text" style="background-color:#F2F2F2;">91,208.00</span></td>
<td id="S3.T2.1.4.3.4" class="ltx_td ltx_align_right"><span id="S3.T2.1.4.3.4.1" class="ltx_text" style="background-color:#F2F2F2;">36,902.23</span></td>
</tr>
<tr id="S3.T2.1.5.4" class="ltx_tr" style="background-color:#FFFFFF;">
<th id="S3.T2.1.5.4.1" class="ltx_td ltx_align_left ltx_th ltx_th_row"><span id="S3.T2.1.5.4.1.1" class="ltx_text" style="background-color:#FFFFFF;"># Completion Tokens</span></th>
<td id="S3.T2.1.5.4.2" class="ltx_td ltx_align_right"><span id="S3.T2.1.5.4.2.1" class="ltx_text" style="background-color:#FFFFFF;">3,161.00</span></td>
<td id="S3.T2.1.5.4.3" class="ltx_td ltx_align_right"><span id="S3.T2.1.5.4.3.1" class="ltx_text" style="background-color:#FFFFFF;">27,162.00</span></td>
<td id="S3.T2.1.5.4.4" class="ltx_td ltx_align_right"><span id="S3.T2.1.5.4.4.1" class="ltx_text" style="background-color:#FFFFFF;">11,567.37</span></td>
</tr>
<tr id="S3.T2.1.6.5" class="ltx_tr" style="background-color:#F2F2F2;">
<th id="S3.T2.1.6.5.1" class="ltx_td ltx_align_left ltx_th ltx_th_row ltx_border_bb"><span id="S3.T2.1.6.5.1.1" class="ltx_text" style="background-color:#F2F2F2;"># Total Tokens</span></th>
<td id="S3.T2.1.6.5.2" class="ltx_td ltx_align_right ltx_border_bb"><span id="S3.T2.1.6.5.2.1" class="ltx_text" style="background-color:#F2F2F2;">15,294.00</span></td>
<td id="S3.T2.1.6.5.3" class="ltx_td ltx_align_right ltx_border_bb"><span id="S3.T2.1.6.5.3.1" class="ltx_text" style="background-color:#F2F2F2;">111,019.00</span></td>
<td id="S3.T2.1.6.5.4" class="ltx_td ltx_align_right ltx_border_bb"><span id="S3.T2.1.6.5.4.1" class="ltx_text" style="background-color:#F2F2F2;">48,469.60</span></td>
</tr>
</tbody>
</table>
</figure>
<div id="S3.p9" class="ltx_para ltx_noindent">
<p id="S3.p9.1" class="ltx_p">We noticed occasional instances of repetitive expressions of gratitude in the dialogue, even after reaching a consensus and making decisions. However, this phenomenon does not significantly impact the final outcome.
The self-reflection mechanism effectively allows agents to extract decision results and conclusions from the dialogue using text summarization-like abilities. This mechanism helps agents avoid unnecessary dialogue and focus on extracting meaningful information. The self-reflection number in the dialogue ranges from 1 to 4, with an average of 1.24. In most cases, agents can autonomously conclude the dialogue based on predefined communication protocols.</p>
</div>
<div id="S3.p10" class="ltx_para ltx_noindent">
<p id="S3.p10.1" class="ltx_p">On average, a chat chain contains 45.60 utterances, ranging from a minimum of 24 to a maximum of 104. The count of utterances encompasses discussions related to achievability of subtasks, evaluations of generated code quality, feedback on testing, advice for improvements, and the actual writing and generation of software code files and documents.
Likewise, we have observed that ChatDev tends to engage in less communication through utterances for abstract tasks compared to specific tasks, averaging around 34.40 utterances. Analysis of the dialogues revealed that during the design and coding stages, agents conducted multiple rounds of discussions to delve into the details of numerous requirements or propose modification suggestions. These discussions aimed to make informed decisions regarding the specific tasks at hand. This phenomenon aligns with real-world practices, where addressing specific tasks often involves more detailed discussions and deliberations.</p>
</div>
<div id="S3.p11" class="ltx_para ltx_noindent">
<p id="S3.p11.3" class="ltx_p">We monitored API interactions and token usage during software production in ChatDev. On average, ChatDev requires 36,902.23 prompt tokens, 11,567.37 completion tokens, and a total of 48,469.60 tokens to develop a single software. The average total cost in software production is approximately <math id="S3.p11.1.m1.1" class="ltx_Math" alttext="\$" display="inline"><semantics id="S3.p11.1.m1.1a"><mo id="S3.p11.1.m1.1.1" xref="S3.p11.1.m1.1.1.cmml">$</mo><annotation-xml encoding="MathML-Content" id="S3.p11.1.m1.1b"><csymbol cd="latexml" id="S3.p11.1.m1.1.1.cmml" xref="S3.p11.1.m1.1.1">currency-dollar</csymbol></annotation-xml><annotation encoding="application/x-tex" id="S3.p11.1.m1.1c">\$</annotation></semantics></math>0.1569<span id="footnote3" class="ltx_note ltx_role_footnote"><sup class="ltx_note_mark">3</sup><span class="ltx_note_outer"><span class="ltx_note_content"><sup class="ltx_note_mark">3</sup><span class="ltx_tag ltx_tag_note">3</span>Based on official API prices for July 2023.</span></span></span>.
To determine the overall cost of software development with ChatDev, we also consider the cost of designer-produced images. The average designer cost is <math id="S3.p11.2.m2.1" class="ltx_Math" alttext="\$" display="inline"><semantics id="S3.p11.2.m2.1a"><mo id="S3.p11.2.m2.1.1" xref="S3.p11.2.m2.1.1.cmml">$</mo><annotation-xml encoding="MathML-Content" id="S3.p11.2.m2.1b"><csymbol cd="latexml" id="S3.p11.2.m2.1.1.cmml" xref="S3.p11.2.m2.1.1">currency-dollar</csymbol></annotation-xml><annotation encoding="application/x-tex" id="S3.p11.2.m2.1c">\$</annotation></semantics></math>0.1398 per software for each software production involving 8.74 graphics creations on average. Thus, the average software development cost at ChatDev is <math id="S3.p11.3.m3.1" class="ltx_Math" alttext="\$" display="inline"><semantics id="S3.p11.3.m3.1a"><mo id="S3.p11.3.m3.1.1" xref="S3.p11.3.m3.1.1.cmml">$</mo><annotation-xml encoding="MathML-Content" id="S3.p11.3.m3.1b"><csymbol cd="latexml" id="S3.p11.3.m3.1.1.cmml" xref="S3.p11.3.m3.1.1">currency-dollar</csymbol></annotation-xml><annotation encoding="application/x-tex" id="S3.p11.3.m3.1c">\$</annotation></semantics></math>0.2967, significantly lower than traditional custom software development companies’ expenses <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib18" title="" class="ltx_ref">18</a>; <a href="#bib.bib21" title="" class="ltx_ref">21</a>; <a href="#bib.bib31" title="" class="ltx_ref">31</a>]</cite>.</p>
</div>
<div id="S3.p12" class="ltx_para ltx_noindent">
<p id="S3.p12.1" class="ltx_p"><span id="S3.p12.1.1" class="ltx_text ltx_font_bold">Reviewer-Programmer Dialogue Analysis</span>  In this section, we delve into the primary exchanges between the reviewer and the programmer, specifically concerning code-related matters during the coding phase. We summarize the reviewer’s evaluations of the programmer’s source code at the coding stage.
Figure <a href="#S3.F7" title="Figure 7 ‣ 3 Experiments ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">7</span></a> provides a visual representation of the reviewer’s suggestions in the form of pie charts. As depicted in the figure, the most frequently discussed issue in the reviewer-programmer communication during code review is “<span id="S3.p12.1.2" class="ltx_text ltx_font_typewriter">methods not implemented</span>” (34.85%). This challenge commonly arises in code generation for complex models, where core functionalities often receive placeholder labels (such as “<span id="S3.p12.1.3" class="ltx_text ltx_font_typewriter">pass</span>” in Python) to be further completed. Additionally, the dialogue frequently addresses the topic of “<span id="S3.p12.1.4" class="ltx_text ltx_font_typewriter">modules not imported</span>” (19.70%). This issue emerges from the nature of code generation, where the generated code tends to overlook minor details. However, in the context of code generation, ensuring the code’s executability becomes crucial. Fortunately, the thought instruction mechanism proposed in this paper effectively tackles these issues by compelling the reviewer to identify incomplete methods and requiring the programmer to fill them. This mechanism can be applied to other scenarios where tasks are completed based on large models but with certain parts missing.
Interestingly, the reviewer also emphasizes the importance of code robustness. They underscore considerations for handling potential exceptions in the future and offer hints on avoiding duplicate categories (3.03%). Additionally, the reviewer provides suggestions regarding unused classes in the code (1.52%), identifies infinite loops (1.52%), and emphasizes the necessity of proper environment initialization (1.52%).</p>
</div>
<figure id="S3.F7" class="ltx_figure"><img src="/html/2307.07924/assets/figures/reviewer_suggestion_distribution.png" id="S3.F7.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="592" height="136" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 7: </span>Distribution of Reviewer’s Suggestions. Each color in the pie chart represents a specific category of suggestions provided by the reviewer.</figcaption>
</figure>
<div id="S3.p13" class="ltx_para ltx_noindent">
<p id="S3.p13.1" class="ltx_p"><span id="S3.p13.1.1" class="ltx_text ltx_font_bold">Tester-Programmer Dialogue Analysis</span>  In a similar fashion, we analyze the debug dialogue between the tester and the programmer during the testing phase and categorize the main types of bugs encountered. The results are presented in Figure <a href="#S3.F8" title="Figure 8 ‣ 3 Experiments ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">8</span></a>.
As observed in the figure, the most frequent debug issue between the tester and the programmer is “<span id="S3.p13.1.2" class="ltx_text ltx_font_typewriter">module not found</span>” (45.76%), accounting for nearly half of the cases. This reflects the model’s tendency to overlook very fine details, despite their simplicity. Fortunately, with the thought instruction mechanism proposed in this paper, such bugs can often be easily resolved by importing the required class or method.
The second most common types of errors are “<span id="S3.p13.1.3" class="ltx_text ltx_font_typewriter">attribute error</span>” and “<span id="S3.p13.1.4" class="ltx_text ltx_font_typewriter">unknown option</span>”, each accounting for 15.25% of the cases. “<span id="S3.p13.1.5" class="ltx_text ltx_font_typewriter">attribute error</span>” refers to errors in the usage of class attributes, while “<span id="S3.p13.1.6" class="ltx_text ltx_font_typewriter">unknown option</span>” indicates errors in the parameters of method calls. Another common type of error is “<span id="S3.p13.1.7" class="ltx_text ltx_font_typewriter">import error</span>” which is similar to “<span id="S3.p13.1.8" class="ltx_text ltx_font_typewriter">module not found</span>” and is primarily caused by mistakes in the import statements, such as importing the wrong class or using an incorrect import path.
In addition to these common error types, ChatDev has the capability to detect relatively rare error types such as improperly initialized GUI (5.08%), incorrect method calling (1.69%), missing file dependencies (1.69%), unused modules (1.69%), decorator syntax errors (1.69%), and more.</p>
</div>
<figure id="S3.F8" class="ltx_figure"><img src="/html/2307.07924/assets/figures/tester_suggestion_distribution.png" id="S3.F8.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="568" height="151" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 8: </span>Distribution of Tester’s Suggestions. Each color in the pie chart represents a specific category of bugs provided by the tester.</figcaption>
</figure>
<div id="S3.p14" class="ltx_para ltx_noindent">
<p id="S3.p14.1" class="ltx_p"><span id="S3.p14.1.1" class="ltx_text ltx_font_bold">Case Study</span>  Figure <a href="#S3.F9" title="Figure 9 ‣ 3 Experiments ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">9</span></a> showcases an example of ChatDev developing a Gomoku game (<span id="S3.p14.1.2" class="ltx_text ltx_font_italic">a.k.a. </span>also known as “<span id="S3.p14.1.3" class="ltx_text ltx_font_italic">Five in a Row</span>” and “<span id="S3.p14.1.4" class="ltx_text ltx_font_italic">Gobang</span>”). In the left, we see the result of a naive software created without GUI. This version of the game can only be played through a command terminal, limiting its interactivity and overall enjoyment.
In contrast, by incorporating GUI design, ChatDev can create a visually appealing small game. This version surpasses the interface-less version in terms of interactivity and user experience, providing a more enjoyable and engaging gameplay environment.
Furthermore, ChatDev’s designer can assist the programmer in creating additional graphics to enhance the GUI’s aesthetics and usability, without compromising its functionality. These graphics, carefully crafted by the designer, contribute to making the GUI more visually pleasing and user-friendly.</p>
</div>
<figure id="S3.F9" class="ltx_figure"><img src="/html/2307.07924/assets/figures/gomoku.png" id="S3.F9.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="592" height="194" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 9: </span>The producted software of the task: “<span id="S3.F9.2.1" class="ltx_text ltx_font_italic">design a basic Gomoku game</span>”.</figcaption>
</figure>
<div id="S3.p15" class="ltx_para ltx_noindent">
<p id="S3.p15.1" class="ltx_p">Additionally, if human users are unsatisfied with the images created by the art designer, they have the flexibility to manually replace the original images after ChatDev completes the software. This allows for further customization according to users’ preferences, without affecting the software’s core functionality. Users can tailor the visual elements to their liking, resulting in a personalized software experience that aligns with their individual preferences.</p>
</div>
<div id="S3.p16" class="ltx_para ltx_noindent">
<p id="S3.p16.1" class="ltx_p">For a more comprehensive understanding, we exemplify the dialogue processes that make programming language choices in designing.
More exemplary dialogues extracted from the chat chain of the Gomoku game are shown in Appendix <a href="#A1" title="Appendix A Appendix ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">A</span></a>, including the prompts we designed and the dialogue process between agents at each phase. Please note that, due to space constraints, we only display key information during the dialogue, omitting overly fine-grained details.</p>
</div>
<div id="S3.p17" class="ltx_para ltx_noindent">
<svg id="S3.p17.pic1" class="ltx_picture" height="284.82" overflow="visible" version="1.1" width="600"><g transform="translate(0,284.82) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 278.92 C 0 282.18 2.64 284.82 5.91 284.82 L 594.09 284.82 C 597.36 284.82 600 282.18 600 278.92 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 260.87 L 598.03 260.87 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 207.79 L 598.03 207.79" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 266.77)"><foreignObject width="556.69" height="12.15" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="S3.p17.pic1.8.8.8.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="S3.p17.pic1.8.8.8.1.1.1" class="ltx_p">Designing: Programming Language</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 219.6)"><foreignObject width="556.69" height="29.46" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="S3.p17.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/ceo.png" id="S3.p17.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="20" height="26" alt="[Uncaptioned image]">
<span id="S3.p17.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1" class="ltx_p">: CEO (Chief Executive Officer)
 <img src="/html/2307.07924/assets/figures/cto.png" id="S3.p17.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">: CTO (Chief Technology Officer)</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="182.2" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.5" class="ltx_ERROR undefined">{dialogue}</span><span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.6" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="S3.p17.pic1.3.3.3.3.3.3.3.3.3.3.3.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="20" height="26" alt="[Uncaptioned image]">
<span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.4" class="ltx_p">To satisfy the new user’s demand and make a desktop application realizable, you should propose a concrete programming language.
<span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.4.1" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cto.png" id="S3.p17.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]"> Python with the Pygame library is a suitable choice for implementing a basic Gomoku game.
<span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.4.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="S3.p17.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.2.g2" class="ltx_graphics ltx_img_portrait" width="20" height="26" alt="[Uncaptioned image]"> Great! Python is a versatile and widely-used programming language that will be suitable for implementing a basic Gomoku game. Its simplicity and readability make it a popular choice for beginners and experienced developers alike.
<span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.4.3" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cto.png" id="S3.p17.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.3.g3" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]"> Let’s get started with the development of the basic Gomoku game in Python using the Pygame library!
<span id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.4.4" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="S3.p17.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.4.g4" class="ltx_graphics ltx_img_portrait" width="20" height="26" alt="[Uncaptioned image]"> &lt;END&gt; Python.</span>
</span></foreignObject></g></g></svg>
</div>
</section>
<section id="S4" class="ltx_section">
<h2 class="ltx_title ltx_title_section">
<span class="ltx_tag ltx_tag_section">4 </span>NLDD Dataset</h2>

<figure id="S4.F10" class="ltx_figure"><img src="/html/2307.07924/assets/figures/ChatDevDataProcess.png" id="S4.F10.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="479" height="284" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 10: </span>The three-stage process of NLDD creation. We only show the generated names of software and the prompt in the figure is for example only.</figcaption>
</figure>
<div id="S4.p1" class="ltx_para ltx_noindent">
<p id="S4.p1.1" class="ltx_p">We collect and open-source<span id="footnote4" class="ltx_note ltx_role_footnote"><sup class="ltx_note_mark">4</sup><span class="ltx_note_outer"><span class="ltx_note_content"><sup class="ltx_note_mark">4</sup><span class="ltx_tag ltx_tag_note">4</span>The data is available at https://github.com/OpenBMB/ChatDev/tree/main/NLDD.</span></span></span> a large and diverse dataset named NLDD (Natural Language Dataset for Dev), which contains 1,200 software prompt data for the Natural Language to Software (NL2Software) task. Each sample in NLDD includes the name, description, and category of the software.</p>
</div>
<div id="S4.p2" class="ltx_para ltx_noindent">
<p id="S4.p2.1" class="ltx_p">NLDD is created by prompting ChatGPT with a three-stage strategy and well-designed rules. We collect the main software category from four prominent software store platforms including Ubuntu Snap Shop, Google Play Store, Microsoft Store, and Apple App Store. We further sorted out five major categories with 40 subcategories and asked ChatGPT to generate software data for these categories. See Figure <a href="#A1.F11" title="Figure 11 ‣ Appendix A Appendix ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">11</span></a> in the appendix for all the category details.</p>
</div>
<div id="S4.p3" class="ltx_para ltx_noindent">
<p id="S4.p3.1" class="ltx_p">To circumvent the generation of repetitive content, NLDD is created with a Query Prompt-based three-stage strategy, including random sampling, prompt sampling, and check. As shown in Figure <a href="#S4.F10" title="Figure 10 ‣ 4 NLDD Dataset ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">10</span></a>, this strategy initially establishes datasets by random sampling some software data, then records existing data, granting ChatGPT autonomy to produce novel entries.</p>
</div>
<div id="S4.p4" class="ltx_para ltx_noindent">
<ol id="S4.I1" class="ltx_enumerate">
<li id="S4.I1.i1" class="ltx_item" style="list-style-type:none;">
<span class="ltx_tag ltx_tag_item">1.</span> 
<div id="S4.I1.i1.p1" class="ltx_para">
<p id="S4.I1.i1.p1.1" class="ltx_p">Random Sampling: First, ChatGPT is independently inquired multiple times to obtain software information under a certain category, and then the duplication is removed at the token granularity of the software name.</p>
</div>
</li>
<li id="S4.I1.i2" class="ltx_item" style="list-style-type:none;">
<span class="ltx_tag ltx_tag_item">2.</span> 
<div id="S4.I1.i2.p1" class="ltx_para">
<p id="S4.I1.i2.p1.1" class="ltx_p">Sequential Sampling: Then we add the generated software information in sequence in the form of negative prompts, requiring ChatGPT to continue generating unique software information.</p>
</div>
</li>
<li id="S4.I1.i3" class="ltx_item" style="list-style-type:none;">
<span class="ltx_tag ltx_tag_item">3.</span> 
<div id="S4.I1.i3.p1" class="ltx_para ltx_noindent">
<p id="S4.I1.i3.p1.1" class="ltx_p">Check: Although ChatGPT has been required to follow certain rules when generating, LLM is more likely to be overconfident when generating according to rules than when judging based on rules. Therefore, our last step is to let ChatGPT determine whether the generated software follows the rules.</p>
</div>
</li>
</ol>
</div>
<div id="S4.p5" class="ltx_para ltx_noindent">
<p id="S4.p5.1" class="ltx_p">NLDD is created with human-designed rules that make the created software easy for researchers to evaluate, for example, the collected software does not need internet or multi-player participation. It is curated to facilitate research in NL2Software. We also give a visualization and analysis of the created software description in the appendix (see Figure <a href="#A1.F12" title="Figure 12 ‣ Appendix A Appendix ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">12</span></a> and <a href="#A1.F13" title="Figure 13 ‣ Appendix A Appendix ‣ Communicative Agents for Software Development" class="ltx_ref"><span class="ltx_text ltx_ref_tag">13</span></a>).</p>
</div>
</section>
<section id="S5" class="ltx_section">
<h2 class="ltx_title ltx_title_section">
<span class="ltx_tag ltx_tag_section">5 </span>Discussion</h2>

<div id="S5.p1" class="ltx_para ltx_noindent">
<p id="S5.p1.1" class="ltx_p">Even though ChatDev offers a novel paradigm for software development that is training-free, efficient, and cost-effective, we recognize the presence of potential risks and limitations that require further investigation and resolution.</p>
</div>
<div id="S5.p2" class="ltx_para ltx_noindent">
<p id="S5.p2.1" class="ltx_p">Even when we set the temperature parameter of the large language model to a very low value, we observe inherent randomness in the generated output. Consequently, each software produced may vary between different runs. As a result, this technology is best suited for open and creative software production scenarios where variations are acceptable.
Moreover, there are instances where the software fails to meet the users’ needs. This can be attributed to unclear user requirements and the inherent randomness in text or code generation.</p>
</div>
<div id="S5.p3" class="ltx_para ltx_noindent">
<p id="S5.p3.1" class="ltx_p">While the designer agent is capable of creating images <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib35" title="" class="ltx_ref">35</a>]</cite>, it is important to acknowledge that the directly generated images may not always enhance the GUI’s aesthetics. At times, they may introduce excessive complexity, which can hinder user experience. This is primarily because each image is generated independently, lacking direct visual correlation. To address this, we have provided the option for users to customize the GUI as a system hyperparameter, allowing them to decide whether to enable this feature or not.</p>
</div>
<div id="S5.p4" class="ltx_para ltx_noindent">
<p id="S5.p4.1" class="ltx_p">Additionally, the large language model may exhibit inherent biases <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib30" title="" class="ltx_ref">30</a>]</cite>, leading to the generation of code patterns that do not necessarily align with the problem-solving thinking of real programmers.
Regarding risks, it is important to note that existing large language models are not fully tuned to be harmless, making them vulnerable to potential misuse by malicious users for harmful purposes. Furthermore, the generated software currently lacks malicious intent identification for sensitive file operations. Therefore, users are advised to conduct their own code review before running the software to prevent any unnecessary data loss.</p>
</div>
<div id="S5.p5" class="ltx_para ltx_noindent">
<p id="S5.p5.1" class="ltx_p">Additionally, the assessment of our ChatDev framework’s software-level task completion capabilities presents formidable challenges, owing to the vast scope and heterogeneous nature of the generated tasks. This mandates the active participation of a multitude of domain experts.</p>
</div>
<div id="S5.p6" class="ltx_para ltx_noindent">
<p id="S5.p6.1" class="ltx_p">Although the study may potentially help junior programmers or engineers in real world, it is challenging for the system to generate perfect source code for high-level or large-scale software requirements. This difficulty arises from the agents’ limited ability to autonomously determine specific implementation details, often resulting in multiple rounds of lengthy discussions. Additionally, large-scale software development proves challenging for both reviewers and testers, as it becomes difficult to identify defects or vulnerabilities within the given time constraints.</p>
</div>
</section>
<section id="S6" class="ltx_section">
<h2 class="ltx_title ltx_title_section">
<span class="ltx_tag ltx_tag_section">6 </span>Related Work</h2>

<section id="S6.SS0.SSS0.Px1" class="ltx_paragraph">
<h4 class="ltx_title ltx_title_paragraph">Deep-Learning-based Software Engineering</h4>

<div id="S6.SS0.SSS0.Px1.p1" class="ltx_para ltx_noindent">
<p id="S6.SS0.SSS0.Px1.p1.1" class="ltx_p">Software engineering (SE) is the process of designing, developing, testing and maintaining software in a methodical, rigorous, and measurable manner<span id="footnote5" class="ltx_note ltx_role_footnote"><sup class="ltx_note_mark">5</sup><span class="ltx_note_outer"><span class="ltx_note_content"><sup class="ltx_note_mark">5</sup><span class="ltx_tag ltx_tag_note">5</span><a href="www.computer.org/sevocab" title="" class="ltx_ref ltx_href">www.computer.org/sevocab</a></span></span></span>.
Due to the complexity of software engineering, a significant number of decisions are made based on intuition and, at best, consultation with senior developers
With the rapid development of the deep learning (DL) technique, many researchers are devoted to apply DL into SE to improve the effectiveness and efficiency of software development, reducing labor cost.
Existing DL-based SE work focuses on five SE stages of the life cycle in software engineering separately <cite class="ltx_cite ltx_citemacro_citep">[<a href="#bib.bib14" title="" class="ltx_ref">14</a>]</cite>:
(1) <span id="S6.SS0.SSS0.Px1.p1.1.1" class="ltx_text ltx_font_italic">Software requirements</span> is to analysis the user demands and specify the requirements for the software <cite class="ltx_cite ltx_citemacro_citep">[<a href="#bib.bib34" title="" class="ltx_ref">34</a>; <a href="#bib.bib46" title="" class="ltx_ref">46</a>; <a href="#bib.bib13" title="" class="ltx_ref">13</a>]</cite>.
(2) <span id="S6.SS0.SSS0.Px1.p1.1.2" class="ltx_text ltx_font_italic">Software design</span> involves the specification of the software framework, modules, protocols, and other features that are necessary for the development of a software <cite class="ltx_cite ltx_citemacro_citep">[<a href="#bib.bib27" title="" class="ltx_ref">27</a>; <a href="#bib.bib38" title="" class="ltx_ref">38</a>; <a href="#bib.bib47" title="" class="ltx_ref">47</a>]</cite>.
(3) <span id="S6.SS0.SSS0.Px1.p1.1.3" class="ltx_text ltx_font_italic">Software implementation</span> is the detailed creation procedure of the software to implement the design <cite class="ltx_cite ltx_citemacro_citep">[<a href="#bib.bib16" title="" class="ltx_ref">16</a>; <a href="#bib.bib1" title="" class="ltx_ref">1</a>; <a href="#bib.bib6" title="" class="ltx_ref">6</a>; <a href="#bib.bib29" title="" class="ltx_ref">29</a>; <a href="#bib.bib11" title="" class="ltx_ref">11</a>]</cite>.
(4) <span id="S6.SS0.SSS0.Px1.p1.1.4" class="ltx_text ltx_font_italic">Software testing</span> is to verify that the software can provide expected behaviors on a set of test cases <cite class="ltx_cite ltx_citemacro_citep">[<a href="#bib.bib42" title="" class="ltx_ref">42</a>; <a href="#bib.bib40" title="" class="ltx_ref">40</a>; <a href="#bib.bib43" title="" class="ltx_ref">43</a>; <a href="#bib.bib39" title="" class="ltx_ref">39</a>]</cite>.
(5) <span id="S6.SS0.SSS0.Px1.p1.1.5" class="ltx_text ltx_font_italic">Software maintenance</span> is to provide necessary support for software users, e.g., documentation generation <cite class="ltx_cite ltx_citemacro_citep">[<a href="#bib.bib19" title="" class="ltx_ref">19</a>; <a href="#bib.bib40" title="" class="ltx_ref">40</a>; <a href="#bib.bib28" title="" class="ltx_ref">28</a>; <a href="#bib.bib20" title="" class="ltx_ref">20</a>]</cite>.
Despite the impressive performance by adapting DL method into SE, these approaches are isolated, which is only able to accomplish a specific step of the whole procedure of software engineering.
Not to mention these DL-based methods require large-scale task-specialized training data to achieve the certain goal, which is unpractical to collect extensive data for the whole procedure of software engineering.</p>
</div>
</section>
<section id="S6.SS0.SSS0.Px2" class="ltx_paragraph">
<h4 class="ltx_title ltx_title_paragraph">Multi-Agent Collaboration</h4>

<div id="S6.SS0.SSS0.Px2.p1" class="ltx_para ltx_noindent">
<p id="S6.SS0.SSS0.Px2.p1.1" class="ltx_p">Large language models (LLMs) have exhibited remarkable proficiency across a wide range of domains.
Recently, there exist several work has explored that utilizing the interactions between LLMs to achieve several goals.
(1) <span id="S6.SS0.SSS0.Px2.p1.1.1" class="ltx_text ltx_font_italic">Behaviour simulation</span>:
Park <span id="S6.SS0.SSS0.Px2.p1.1.2" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib33" title="" class="ltx_ref">33</a>]</cite> create multiple generative agents with a sandbox environment to simulate believable human behavior.
Wang <span id="S6.SS0.SSS0.Px2.p1.1.3" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib41" title="" class="ltx_ref">41</a>]</cite> use multiple agents to simulate the user behaviours in the recommendation scenario.
(2) <span id="S6.SS0.SSS0.Px2.p1.1.4" class="ltx_text ltx_font_italic">Data construction</span>:
Wei <span id="S6.SS0.SSS0.Px2.p1.1.5" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib45" title="" class="ltx_ref">45</a>]</cite> assign agents with different roles to collect and evaluate multi-party conversations. Li <span id="S6.SS0.SSS0.Px2.p1.1.6" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib24" title="" class="ltx_ref">24</a>]</cite> propose a role-playing framework which leverages agents to generate diverse and detailed instructions for complicated tasks.
(3) <span id="S6.SS0.SSS0.Px2.p1.1.7" class="ltx_text ltx_font_italic">Performance improvement</span>:
Salewski <span id="S6.SS0.SSS0.Px2.p1.1.8" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib36" title="" class="ltx_ref">36</a>]</cite> find that asking the agent to take on different roles can improve their performance.
Du <span id="S6.SS0.SSS0.Px2.p1.1.9" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib12" title="" class="ltx_ref">12</a>]</cite> improve the factual correctness and reasoning accuracy by leveraging multi-agent debate.
Liang <span id="S6.SS0.SSS0.Px2.p1.1.10" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib25" title="" class="ltx_ref">25</a>]</cite> use multiple agents to debate each other to solve the degeneration-of-thought problem in self-reflection.
Fu <span id="S6.SS0.SSS0.Px2.p1.1.11" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib15" title="" class="ltx_ref">15</a>]</cite> find that multiple agents can improve each other in a negotiation game like buyer-seller dealing by role-playing and learning from the agent feedback.
Liu <span id="S6.SS0.SSS0.Px2.p1.1.12" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib26" title="" class="ltx_ref">26</a>]</cite> design a simulated social interaction sandbox to achieve social alignment for LLMs.
Talebirad <span id="S6.SS0.SSS0.Px2.p1.1.13" class="ltx_text ltx_font_italic">et al.</span> <cite class="ltx_cite ltx_citemacro_cite">[<a href="#bib.bib37" title="" class="ltx_ref">37</a>]</cite> introduce multiple agents with unique attributes and roles to handle complex tasks in a black box environment.</p>
</div>
</section>
</section>
<section id="S7" class="ltx_section">
<h2 class="ltx_title ltx_title_section">
<span class="ltx_tag ltx_tag_section">7 </span>Conclusion</h2>

<div id="S7.p1" class="ltx_para ltx_noindent">
<p id="S7.p1.1" class="ltx_p">In this study, we have presented ChatDev, a chat-based end-to-end software development framework that leverages LLMs to facilitate effective communication and collaboration among multiple roles involved in the software development process. By decomposing the development process into sequential atomic subtasks through the use of the chat chain, ChatDev enables granular focus and promotes desired outputs for each subtask. Additionally, the thought instruction mechanism alleviates challenges related to code hallucinations by guiding programmers through specific code modifications during code completion, reviewing, and testing.
Our experimental results demonstrate the efficiency and cost-effectiveness of the automated software development process driven by ChatDev.
By employing multiple software agents with different roles, we have proposed a new paradigm in generating software systems, alleviating code vulnerabilities, and identifying and resolving potential bugs. The collaborative interactions and mutual examination between roles within each chat have contributed to effective decision-making for each subtask.</p>
</div>
<div id="S7.p2" class="ltx_para ltx_noindent">
<p id="S7.p2.1" class="ltx_p">Moving forward, further research can focus on refining the communication protocols and optimizing the interaction dynamics within each chat to enhance the performance and effectiveness of ChatDev. Additionally, exploring the integration of other emerging technologies, such as reinforcement learning and explainable AI, could provide valuable insights into addressing challenges and improving the overall software development process.
Our research will persist in exploring enhancements and advancements in ChatDev agents, workflow, and development environments. The overarching objective is to achieve even greater efficiency in software production by improving various characteristics, such as reducing the length of chat chains or optimizing subtask solving logic and strategies, ultimately leading to more streamlined and effective software production processes.
We hope the potential of the proposed natural-language-to-software framework can illuminate fresh possibilities for integrating LLMs into software development and mark the dawn of a new frontier in the field of natural language processing, software engineering, and collective intelligence.</p>
</div>
</section>
<section id="Sx1" class="ltx_section">
<h2 class="ltx_title ltx_title_section">Contributions</h2>

<div id="Sx1.p1" class="ltx_para ltx_noindent">
<p id="Sx1.p1.1" class="ltx_p">The authors’ contributions are delineated as follows: During the project’s formulation, Chen Qian, Xin Cong, and Cheng Yang orchestrated the design of the model architecture. In the process of refining the model’s structure, Dahai Li, Zhiyuan Liu, and Maosong Sun provided invaluable guidance. The main paper was composed by Chen Qian, Xin Cong, Weize Chen, Yusheng Su, and Juyuan Xu, with input from Cheng Yang, Weize Chen, Yusheng Su, Zhiyuan Liu, and Maosong Sun to enhance its clarity. To enhance public accessibility, Wei Liu, Yufan Dang, and Jiahao Li championed the open-source repository through comprehensive testing; Wei Liu restructured and optimized the system. Additionally, Wei Liu and Yufan Dang spearheaded the development of the online demo to ensure wider dissemination.</p>
</div>
</section>
<section id="Sx2" class="ltx_section">
<h2 class="ltx_title ltx_title_section">Acknowledgements</h2>

<div id="Sx2.p1" class="ltx_para ltx_noindent">
<p id="Sx2.p1.1" class="ltx_p">We thank Yujia Qin, Shengding Hu, Yankai Lin, Bowen Li, Jingwei Zuo, Xuanhe Zhou, Shuo Wang, Qimin Zhan, and Yukun Yan for their active participation in various discussions and providing valuable feedback on this research.
We also express our gratitude to the <a target="_blank" href="https://github.com/OpenBMB/AgentVerse/" title="" class="ltx_ref ltx_href">AgentVerse</a>, <a target="_blank" href="https://www.camel-ai.org/" title="" class="ltx_ref ltx_href">Camel</a> and <a target="_blank" href="https://www.gather.town/" title="" class="ltx_ref ltx_href">Gather</a> projects for providing the initial foundation for this project.</p>
</div>
</section>
<section id="bib" class="ltx_bibliography">
<h2 class="ltx_title ltx_title_bibliography">References</h2>

<ul class="ltx_biblist">
<li id="bib.bib1" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[1]</span>
<span class="ltx_bibblock">
Mohammad Alahmadi, Abdulkarim Khormi, Biswas Parajuli, Jonathan Hassel, Sonia
Haiduc, and Piyush Kumar.

</span>
<span class="ltx_bibblock">Code localization in programming screencasts.

</span>
<span class="ltx_bibblock"><span id="bib.bib1.1.1" class="ltx_text ltx_font_italic">Empir. Softw. Eng.</span>, 25(2):1536–1572, 2020.

</span>
</li>
<li id="bib.bib2" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[2]</span>
<span class="ltx_bibblock">
Razvan Azamfirei, Sapna R Kudchadkar, and James Fackler.

</span>
<span class="ltx_bibblock">Large language models and the perils of their hallucinations.

</span>
<span class="ltx_bibblock"><span id="bib.bib2.1.1" class="ltx_text ltx_font_italic">Critical Care</span>, 27(1):1–2, 2023.

</span>
</li>
<li id="bib.bib3" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[3]</span>
<span class="ltx_bibblock">
Youssef Bassil.

</span>
<span class="ltx_bibblock">A simulation model for the waterfall software development life cycle.

</span>
<span class="ltx_bibblock"><span id="bib.bib3.1.1" class="ltx_text ltx_font_italic">arXiv preprint arXiv:1205.6904</span>, 2012.

</span>
</li>
<li id="bib.bib4" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[4]</span>
<span class="ltx_bibblock">
Jorge Biolchini, Paula Gomes Mian, Ana Candida Cruz Natali, and Guilherme Horta
Travassos.

</span>
<span class="ltx_bibblock">Systematic review in software engineering.

</span>
<span class="ltx_bibblock"><span id="bib.bib4.1.1" class="ltx_text ltx_font_italic">System engineering and computer science department COPPE/UFRJ,
Technical Report ES</span>, 679(05):45, 2005.

</span>
</li>
<li id="bib.bib5" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[5]</span>
<span class="ltx_bibblock">
Tom Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared D Kaplan, Prafulla
Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell,
et al.

</span>
<span class="ltx_bibblock">Language models are few-shot learners.

</span>
<span class="ltx_bibblock"><span id="bib.bib5.1.1" class="ltx_text ltx_font_italic">Advances in neural information processing systems</span>,
33:1877–1901, 2020.

</span>
</li>
<li id="bib.bib6" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[6]</span>
<span class="ltx_bibblock">
Mark Chen, Jerry Tworek, Heewoo Jun, Qiming Yuan, Henrique Pondé
de Oliveira Pinto, Jared Kaplan, Harrison Edwards, Yuri Burda, Nicholas
Joseph, Greg Brockman, Alex Ray, Raul Puri, Gretchen Krueger, Michael Petrov,
Heidy Khlaaf, Girish Sastry, Pamela Mishkin, Brooke Chan, Scott Gray, Nick
Ryder, Mikhail Pavlov, Alethea Power, Lukasz Kaiser, Mohammad Bavarian,
Clemens Winter, Philippe Tillet, Felipe Petroski Such, Dave Cummings,
Matthias Plappert, Fotios Chantzis, Elizabeth Barnes, Ariel Herbert-Voss,
William Hebgen Guss, Alex Nichol, Alex Paino, Nikolas Tezak, Jie Tang, Igor
Babuschkin, Suchir Balaji, Shantanu Jain, William Saunders, Christopher
Hesse, Andrew N. Carr, Jan Leike, Joshua Achiam, Vedant Misra, Evan Morikawa,
Alec Radford, Matthew Knight, Miles Brundage, Mira Murati, Katie Mayer, Peter
Welinder, Bob McGrew, Dario Amodei, Sam McCandlish, Ilya Sutskever, and
Wojciech Zaremba.

</span>
<span class="ltx_bibblock">Evaluating large language models trained on code.

</span>
<span class="ltx_bibblock"><span id="bib.bib6.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2107.03374, 2021.

</span>
</li>
<li id="bib.bib7" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[7]</span>
<span class="ltx_bibblock">
Mark Chen, Jerry Tworek, Heewoo Jun, Qiming Yuan, Henrique Ponde de Oliveira
Pinto, Jared Kaplan, Harri Edwards, Yuri Burda, Nicholas Joseph, Greg
Brockman, et al.

</span>
<span class="ltx_bibblock">Evaluating large language models trained on code.

</span>
<span class="ltx_bibblock"><span id="bib.bib7.1.1" class="ltx_text ltx_font_italic">arXiv preprint arXiv:2107.03374</span>, 2021.

</span>
</li>
<li id="bib.bib8" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[8]</span>
<span class="ltx_bibblock">
Xinyun Chen, Maxwell Lin, Nathanael Schärli, and Denny Zhou.

</span>
<span class="ltx_bibblock">Teaching large language models to self-debug.

</span>
<span class="ltx_bibblock"><span id="bib.bib8.1.1" class="ltx_text ltx_font_italic">arXiv preprint arXiv:2304.05128</span>, 2023.

</span>
</li>
<li id="bib.bib9" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[9]</span>
<span class="ltx_bibblock">
Roi Cohen, May Hamri, Mor Geva, and Amir Globerson.

</span>
<span class="ltx_bibblock">Lm vs lm: Detecting factual errors via cross examination.

</span>
<span class="ltx_bibblock"><span id="bib.bib9.1.1" class="ltx_text ltx_font_italic">arXiv preprint arXiv:2305.13281</span>, 2023.

</span>
</li>
<li id="bib.bib10" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[10]</span>
<span class="ltx_bibblock">
Juan de Vicente Mohino, Javier Bermejo Higuera, Juan Ramón Bermejo Higuera,
and Juan Antonio Sicilia Montalvo.

</span>
<span class="ltx_bibblock">The application of a new secure software development life cycle
(s-sdlc) with agile methodologies.

</span>
<span class="ltx_bibblock"><span id="bib.bib10.1.1" class="ltx_text ltx_font_italic">Electronics</span>, 8(11):1218, 2019.

</span>
</li>
<li id="bib.bib11" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[11]</span>
<span class="ltx_bibblock">
Yihong Dong, Xue Jiang, Zhi Jin, and Ge Li.

</span>
<span class="ltx_bibblock">Self-collaboration code generation via chatgpt, 2023.

</span>
</li>
<li id="bib.bib12" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[12]</span>
<span class="ltx_bibblock">
Yilun Du, Shuang Li, Antonio Torralba, Joshua B. Tenenbaum, and Igor Mordatch.

</span>
<span class="ltx_bibblock">Improving factuality and reasoning in language models through
multiagent debate.

</span>
<span class="ltx_bibblock"><span id="bib.bib12.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2305.14325, 2023.

</span>
</li>
<li id="bib.bib13" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[13]</span>
<span class="ltx_bibblock">
Saad Ezzini, Sallam Abualhaija, Chetan Arora, and Mehrdad Sabetzadeh.

</span>
<span class="ltx_bibblock">Automated handling of anaphoric ambiguity in requirements: A
multi-solution study.

</span>
<span class="ltx_bibblock">In <span id="bib.bib13.1.1" class="ltx_text ltx_font_italic">44th IEEE/ACM 44th International Conference on Software
Engineering, ICSE 2022, Pittsburgh, PA, USA, May 25-27, 2022</span>, pages
187–199. ACM, 2022.

</span>
</li>
<li id="bib.bib14" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[14]</span>
<span class="ltx_bibblock">
Peter Freeman, Donald J. Bagert, Hossein Saiedian, Mary Shaw, Robert Dupuis,
and J. Barrie Thompson.

</span>
<span class="ltx_bibblock">Software engineering body of knowledge (SWEBOK).

</span>
<span class="ltx_bibblock">In <span id="bib.bib14.1.1" class="ltx_text ltx_font_italic">Proceedings of the 23rd International Conference on Software
Engineering, ICSE 2001, 12-19 May 2001, Toronto, Ontario, Canada</span>, pages
693–696. IEEE Computer Society, 2001.

</span>
</li>
<li id="bib.bib15" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[15]</span>
<span class="ltx_bibblock">
Yao Fu, Hao Peng, Tushar Khot, and Mirella Lapata.

</span>
<span class="ltx_bibblock">Improving language model negotiation with self-play and in-context
learning from AI feedback.

</span>
<span class="ltx_bibblock"><span id="bib.bib15.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2305.10142, 2023.

</span>
</li>
<li id="bib.bib16" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[16]</span>
<span class="ltx_bibblock">
Sa Gao, Chunyang Chen, Zhenchang Xing, Yukun Ma, Wen Song, and Shang-Wei Lin.

</span>
<span class="ltx_bibblock">A neural model for method name generation from functional
description.

</span>
<span class="ltx_bibblock">In <span id="bib.bib16.1.1" class="ltx_text ltx_font_italic">26th IEEE International Conference on Software Analysis,
Evolution and Reengineering, SANER 2019, Hangzhou, China, February 24-27,
2019</span>, pages 411–421. IEEE, 2019.

</span>
</li>
<li id="bib.bib17" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[17]</span>
<span class="ltx_bibblock">
Robert L. Glass, Iris Vessey, and Venkataraman Ramesh.

</span>
<span class="ltx_bibblock">Research in software engineering: an analysis of the literature.

</span>
<span class="ltx_bibblock"><span id="bib.bib17.1.1" class="ltx_text ltx_font_italic">Information and Software technology</span>, 44(8):491–506, 2002.

</span>
</li>
<li id="bib.bib18" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[18]</span>
<span class="ltx_bibblock">
Fred J Heemstra.

</span>
<span class="ltx_bibblock">Software cost estimation.

</span>
<span class="ltx_bibblock"><span id="bib.bib18.1.1" class="ltx_text ltx_font_italic">Information and software technology</span>, 34(10):627–639, 1992.

</span>
</li>
<li id="bib.bib19" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[19]</span>
<span class="ltx_bibblock">
Xing Hu, Ge Li, Xin Xia, David Lo, and Zhi Jin.

</span>
<span class="ltx_bibblock">Deep code comment generation.

</span>
<span class="ltx_bibblock">In <span id="bib.bib19.1.1" class="ltx_text ltx_font_italic">Proceedings of the 26th Conference on Program Comprehension,
ICPC 2018, Gothenburg, Sweden, May 27-28, 2018</span>, pages 200–210. ACM,
2018.

</span>
</li>
<li id="bib.bib20" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[20]</span>
<span class="ltx_bibblock">
Xing Hu, Xin Xia, David Lo, Zhiyuan Wan, Qiuyuan Chen, and Thomas Zimmermann.

</span>
<span class="ltx_bibblock">Practitioners’ expectations on automated code comment generation.

</span>
<span class="ltx_bibblock">In <span id="bib.bib20.1.1" class="ltx_text ltx_font_italic">44th IEEE/ACM 44th International Conference on Software
Engineering, ICSE 2022, Pittsburgh, PA, USA, May 25-27, 2022</span>, pages
1693–1705. ACM, 2022.

</span>
</li>
<li id="bib.bib21" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[21]</span>
<span class="ltx_bibblock">
Magne Jorgensen and Martin Shepperd.

</span>
<span class="ltx_bibblock">A systematic review of software development cost estimation studies.

</span>
<span class="ltx_bibblock"><span id="bib.bib21.1.1" class="ltx_text ltx_font_italic">IEEE Transactions on Software Engineering</span>, 33(1):33–53, 2007.

</span>
</li>
<li id="bib.bib22" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[22]</span>
<span class="ltx_bibblock">
Rafiq Ahmad Khan, Siffat Ullah Khan, Habib Ullah Khan, and Muhammad Ilyas.

</span>
<span class="ltx_bibblock">Systematic literature review on security risks and its practices in
secure software development.

</span>
<span class="ltx_bibblock"><span id="bib.bib22.1.1" class="ltx_text ltx_font_italic">ieee Access</span>, 10:5456–5481, 2022.

</span>
</li>
<li id="bib.bib23" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[23]</span>
<span class="ltx_bibblock">
Guohao Li, Hasan Abed Al Kader Hammoud, Hani Itani, Dmitrii Khizbullin, and
Bernard Ghanem.

</span>
<span class="ltx_bibblock">Camel: Communicative agents for" mind" exploration of large scale
language model society.

</span>
<span class="ltx_bibblock"><span id="bib.bib23.1.1" class="ltx_text ltx_font_italic">arXiv preprint arXiv:2303.17760</span>, 2023.

</span>
</li>
<li id="bib.bib24" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[24]</span>
<span class="ltx_bibblock">
Guohao Li, Hasan Abed Al Kader Hammoud, Hani Itani, Dmitrii Khizbullin, and
Bernard Ghanem.

</span>
<span class="ltx_bibblock">CAMEL: communicative agents for "mind" exploration of large scale
language model society.

</span>
<span class="ltx_bibblock"><span id="bib.bib24.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2303.17760, 2023.

</span>
</li>
<li id="bib.bib25" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[25]</span>
<span class="ltx_bibblock">
Tian Liang, Zhiwei He, Wenxiang Jiao, Xing Wang, Yan Wang, Rui Wang, Yujiu
Yang, Zhaopeng Tu, and Shuming Shi.

</span>
<span class="ltx_bibblock">Encouraging divergent thinking in large language models through
multi-agent debate.

</span>
<span class="ltx_bibblock"><span id="bib.bib25.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2305.19118, 2023.

</span>
</li>
<li id="bib.bib26" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[26]</span>
<span class="ltx_bibblock">
Ruibo Liu, Ruixin Yang, Chenyan Jia, Ge Zhang, Denny Zhou, Andrew M. Dai, Diyi
Yang, and Soroush Vosoughi.

</span>
<span class="ltx_bibblock">Training socially aligned language models in simulated human society.

</span>
<span class="ltx_bibblock"><span id="bib.bib26.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2305.16960, 2023.

</span>
</li>
<li id="bib.bib27" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[27]</span>
<span class="ltx_bibblock">
Cuauhtémoc López Martín and Alain Abran.

</span>
<span class="ltx_bibblock">Neural networks for predicting the duration of new software projects.

</span>
<span class="ltx_bibblock"><span id="bib.bib27.1.1" class="ltx_text ltx_font_italic">J. Syst. Softw.</span>, 101:127–135, 2015.

</span>
</li>
<li id="bib.bib28" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[28]</span>
<span class="ltx_bibblock">
Nadia Nahar, Shurui Zhou, Grace A. Lewis, and Christian Kästner.

</span>
<span class="ltx_bibblock">Collaboration challenges in building ml-enabled systems:
Communication, documentation, engineering, and process.

</span>
<span class="ltx_bibblock">In <span id="bib.bib28.1.1" class="ltx_text ltx_font_italic">44th IEEE/ACM 44th International Conference on Software
Engineering, ICSE 2022, Pittsburgh, PA, USA, May 25-27, 2022</span>, pages
413–425. ACM, 2022.

</span>
</li>
<li id="bib.bib29" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[29]</span>
<span class="ltx_bibblock">
Erik Nijkamp, Bo Pang, Hiroaki Hayashi, Lifu Tu, Huan Wang, Yingbo Zhou, Silvio
Savarese, and Caiming Xiong.

</span>
<span class="ltx_bibblock">Codegen: An open large language model for code with multi-turn
program synthesis.

</span>
<span class="ltx_bibblock">In <span id="bib.bib29.1.1" class="ltx_text ltx_font_italic">The Eleventh International Conference on Learning
Representations, ICLR 2023, Kigali, Rwanda, May 1-5, 2023</span>. OpenReview.net,
2023.

</span>
</li>
<li id="bib.bib30" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[30]</span>
<span class="ltx_bibblock">
Long Ouyang, Jeffrey Wu, Xu Jiang, Diogo Almeida, Carroll Wainwright, Pamela
Mishkin, Chong Zhang, Sandhini Agarwal, Katarina Slama, Alex Ray, et al.

</span>
<span class="ltx_bibblock">Training language models to follow instructions with human feedback.

</span>
<span class="ltx_bibblock"><span id="bib.bib30.1.1" class="ltx_text ltx_font_italic">Advances in Neural Information Processing Systems</span>,
35:27730–27744, 2022.

</span>
</li>
<li id="bib.bib31" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[31]</span>
<span class="ltx_bibblock">
Mohd. Owais and R. Ramakishore.

</span>
<span class="ltx_bibblock">Effort, duration and cost estimation in agile software development.

</span>
<span class="ltx_bibblock">In <span id="bib.bib31.1.1" class="ltx_text ltx_font_italic">2016 Ninth International Conference on Contemporary Computing
(IC3)</span>, pages 1–5, 2016.

</span>
</li>
<li id="bib.bib32" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[32]</span>
<span class="ltx_bibblock">
Joon Sung Park, Joseph C O’Brien, Carrie J Cai, Meredith Ringel Morris, Percy
Liang, and Michael S Bernstein.

</span>
<span class="ltx_bibblock">Generative agents: Interactive simulacra of human behavior.

</span>
<span class="ltx_bibblock"><span id="bib.bib32.1.1" class="ltx_text ltx_font_italic">arXiv preprint arXiv:2304.03442</span>, 2023.

</span>
</li>
<li id="bib.bib33" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[33]</span>
<span class="ltx_bibblock">
Joon Sung Park, Joseph C. O’Brien, Carrie J. Cai, Meredith Ringel Morris, Percy
Liang, and Michael S. Bernstein.

</span>
<span class="ltx_bibblock">Generative agents: Interactive simulacra of human behavior.

</span>
<span class="ltx_bibblock"><span id="bib.bib33.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2304.03442, 2023.

</span>
</li>
<li id="bib.bib34" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[34]</span>
<span class="ltx_bibblock">
Florian Pudlitz, Florian Brokhausen, and Andreas Vogelsang.

</span>
<span class="ltx_bibblock">Extraction of system states from natural language requirements.

</span>
<span class="ltx_bibblock">In <span id="bib.bib34.1.1" class="ltx_text ltx_font_italic">27th IEEE International Requirements Engineering
Conference, RE 2019, Jeju Island, Korea (South), September 23-27, 2019</span>,
pages 211–222. IEEE, 2019.

</span>
</li>
<li id="bib.bib35" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[35]</span>
<span class="ltx_bibblock">
Aditya Ramesh, Prafulla Dhariwal, Alex Nichol, Casey Chu, and Mark Chen.

</span>
<span class="ltx_bibblock">Hierarchical text-conditional image generation with clip latents.

</span>
<span class="ltx_bibblock"><span id="bib.bib35.1.1" class="ltx_text ltx_font_italic">arXiv preprint arXiv:2204.06125</span>, 2022.

</span>
</li>
<li id="bib.bib36" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[36]</span>
<span class="ltx_bibblock">
Leonard Salewski, Stephan Alaniz, Isabel Rio-Torto, Eric Schulz, and Zeynep
Akata.

</span>
<span class="ltx_bibblock">In-context impersonation reveals large language models’ strengths and
biases.

</span>
<span class="ltx_bibblock"><span id="bib.bib36.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2305.14930, 2023.

</span>
</li>
<li id="bib.bib37" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[37]</span>
<span class="ltx_bibblock">
Yashar Talebirad and Amirhossein Nadiri.

</span>
<span class="ltx_bibblock">Multi-agent collaboration: Harnessing the power of intelligent LLM
agents.

</span>
<span class="ltx_bibblock"><span id="bib.bib37.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2306.03314, 2023.

</span>
</li>
<li id="bib.bib38" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[38]</span>
<span class="ltx_bibblock">
Hannes Thaller, Lukas Linsbauer, and Alexander Egyed.

</span>
<span class="ltx_bibblock">Feature maps: A comprehensible software representation for design
pattern detection.

</span>
<span class="ltx_bibblock">In <span id="bib.bib38.1.1" class="ltx_text ltx_font_italic">26th IEEE International Conference on Software Analysis,
Evolution and Reengineering, SANER 2019, Hangzhou, China, February 24-27,
2019</span>, pages 207–217. IEEE, 2019.

</span>
</li>
<li id="bib.bib39" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[39]</span>
<span class="ltx_bibblock">
Chengcheng Wan, Shicheng Liu, Sophie Xie, Yifan Liu, Henry Hoffmann, Michael
Maire, and Shan Lu.

</span>
<span class="ltx_bibblock">Automated testing of software that uses machine learning apis.

</span>
<span class="ltx_bibblock">In <span id="bib.bib39.1.1" class="ltx_text ltx_font_italic">44th IEEE/ACM 44th International Conference on Software
Engineering, ICSE 2022, Pittsburgh, PA, USA, May 25-27, 2022</span>, pages
212–224. ACM, 2022.

</span>
</li>
<li id="bib.bib40" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[40]</span>
<span class="ltx_bibblock">
Yao Wan, Zhou Zhao, Min Yang, Guandong Xu, Haochao Ying, Jian Wu, and Philip S.
Yu.

</span>
<span class="ltx_bibblock">Improving automatic source code summarization via deep reinforcement
learning.

</span>
<span class="ltx_bibblock">In <span id="bib.bib40.1.1" class="ltx_text ltx_font_italic">Proceedings of the 33rd ACM/IEEE International Conference
on Automated Software Engineering, ASE 2018, Montpellier, France, September
3-7, 2018</span>, pages 397–407. ACM, 2018.

</span>
</li>
<li id="bib.bib41" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[41]</span>
<span class="ltx_bibblock">
Lei Wang, Jingsen Zhang, Xu Chen, Yankai Lin, Ruihua Song, Wayne Xin Zhao, and
Ji-Rong Wen.

</span>
<span class="ltx_bibblock">Recagent: A novel simulation paradigm for recommender systems.

</span>
<span class="ltx_bibblock"><span id="bib.bib41.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2306.02552, 2023.

</span>
</li>
<li id="bib.bib42" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[42]</span>
<span class="ltx_bibblock">
Song Wang, Taiyue Liu, and Lin Tan.

</span>
<span class="ltx_bibblock">Automatically learning semantic features for defect prediction.

</span>
<span class="ltx_bibblock">In <span id="bib.bib42.1.1" class="ltx_text ltx_font_italic">Proceedings of the 38th International Conference on Software
Engineering, ICSE 2016, Austin, TX, USA, May 14-22, 2016</span>, pages 297–308.
ACM, 2016.

</span>
</li>
<li id="bib.bib43" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[43]</span>
<span class="ltx_bibblock">
Song Wang, Nishtha Shrestha, Abarna Kucheri Subburaman, Junjie Wang, Moshi Wei,
and Nachiappan Nagappan.

</span>
<span class="ltx_bibblock">Automatic unit test generation for machine learning libraries: How
far are we?

</span>
<span class="ltx_bibblock">In <span id="bib.bib43.1.1" class="ltx_text ltx_font_italic">43rd IEEE/ACM International Conference on Software
Engineering, ICSE 2021, Madrid, Spain, 22-30 May 2021</span>, pages 1548–1560.
IEEE, 2021.

</span>
</li>
<li id="bib.bib44" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[44]</span>
<span class="ltx_bibblock">
Jason Wei, Xuezhi Wang, Dale Schuurmans, Maarten Bosma, Fei Xia, Ed Chi, Quoc V
Le, Denny Zhou, et al.

</span>
<span class="ltx_bibblock">Chain-of-thought prompting elicits reasoning in large language
models.

</span>
<span class="ltx_bibblock"><span id="bib.bib44.1.1" class="ltx_text ltx_font_italic">Advances in Neural Information Processing Systems</span>,
35:24824–24837, 2022.

</span>
</li>
<li id="bib.bib45" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[45]</span>
<span class="ltx_bibblock">
Jimmy Wei, Kurt Shuster, Arthur Szlam, Jason Weston, Jack Urbanek, and Mojtaba
Komeili.

</span>
<span class="ltx_bibblock">Multi-party chat: Conversational agents in group settings with humans
and models.

</span>
<span class="ltx_bibblock"><span id="bib.bib45.1.1" class="ltx_text ltx_font_italic">CoRR</span>, abs/2304.13835, 2023.

</span>
</li>
<li id="bib.bib46" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[46]</span>
<span class="ltx_bibblock">
Jonas Winkler, Jannis Grönberg, and Andreas Vogelsang.

</span>
<span class="ltx_bibblock">Predicting how to test requirements: An automated approach.

</span>
<span class="ltx_bibblock">In <span id="bib.bib46.1.1" class="ltx_text ltx_font_italic">Software Engineering 2020, Fachtagung des GI-Fachbereichs
Softwaretechnik, 24.-28. Februar 2020, Innsbruck, Austria</span>, volume P-300 of
<span id="bib.bib46.2.2" class="ltx_text ltx_font_italic">LNI</span>, pages 141–142. Gesellschaft für Informatik e.V., 2020.

</span>
</li>
<li id="bib.bib47" class="ltx_bibitem">
<span class="ltx_tag ltx_role_refnum ltx_tag_bibitem">[47]</span>
<span class="ltx_bibblock">
Tianming Zhao, Chunyang Chen, Yuanning Liu, and Xiaodong Zhu.

</span>
<span class="ltx_bibblock">GUIGAN: learning to generate GUI designs using generative
adversarial networks.

</span>
<span class="ltx_bibblock">In <span id="bib.bib47.1.1" class="ltx_text ltx_font_italic">43rd IEEE/ACM International Conference on Software
Engineering, ICSE 2021, Madrid, Spain, 22-30 May 2021</span>, pages 748–760.
IEEE, 2021.

</span>
</li>
</ul>
</section>
<div class="ltx_pagination ltx_role_newpage"></div>
<section id="A1" class="ltx_appendix">
<h2 class="ltx_title ltx_title_appendix">
<span class="ltx_tag ltx_tag_appendix">Appendix A </span>Appendix</h2>

<div id="A1.p1" class="ltx_para ltx_noindent">
<svg id="A1.p1.pic1" class="ltx_picture" height="560.17" overflow="visible" version="1.1" width="600"><g transform="translate(0,560.17) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 554.26 C 0 557.52 2.64 560.17 5.91 560.17 L 594.09 560.17 C 597.36 560.17 600 557.52 600 554.26 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 536.06 L 598.03 536.06 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 541.96)"><foreignObject width="556.69" height="12.3" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p1.pic1.8.8.8.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p1.pic1.8.8.8.1.1.1" class="ltx_p">Role Specialization</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="510.47" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.1" class="ltx_p">: I am the CEO of ChatDev. My main responsibilities include being an active decision-maker on users’ demands and other key policy issues, leader, manager, and executor. My decision-making role involves high-level decisions about policy and strategy; and my communicator role can involve speaking to the organization’s management and employees.</span>
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.2" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;position:relative; bottom:3.0pt;background:black;display:inline-block;"> </span></span><img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p1.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.g2" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.3" class="ltx_p">: I am the CPO of ChatDev. I am responsible for all product-related matters in ChatDev. Usually includes product design, product strategy, product vision, product innovation, project management and product marketing.</span>
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.4" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;position:relative; bottom:3.0pt;background:black;display:inline-block;"> </span></span><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p1.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.g3" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.5" class="ltx_p">: I am the CTO of ChatDev. I am very similar to information technology. I will make high-level decisions for the overarching technology infrastructure that closely align with the organization’s goals, while I work alongside the organization’s information technology staff members to perform everyday operations.</span>
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;position:relative; bottom:3.0pt;background:black;display:inline-block;"> </span></span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p1.pic1.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.g4" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7" class="ltx_p">: I am a professional programmer of ChatDev. I can write/create computer software or applications by providing a specific programming language to the computer. I have extensive computing and coding experience in many varieties of programming languages and platforms, such as Python, Java, C, C++, HTML, CSS, JavaScript, XML, SQL, PHP, etc,.</span>
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.8" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;position:relative; bottom:3.0pt;background:black;display:inline-block;"> </span></span><img src="/html/2307.07924/assets/figures/reviewer.png" id="A1.p1.pic1.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.g5" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.9" class="ltx_p">: I am a code reviewer of ChatDev. I can help programmers to assess source codes for software troubleshooting, fix bugs to increase code quality and robustness, and offer proposals to improve the source codes.</span>
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.10" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;position:relative; bottom:3.0pt;background:black;display:inline-block;"> </span></span><img src="/html/2307.07924/assets/figures/tester.png" id="A1.p1.pic1.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.g6" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.11" class="ltx_p">: I am a code tester of ChatDev. I can use the software as intended to analyze its functional properties, design manual and automated test procedures to evaluate each software product, build and implement software evaluation test programs, and run test programs to ensure that testing protocols evaluate the software correctly.</span>
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.12" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;position:relative; bottom:3.0pt;background:black;display:inline-block;"> </span></span><img src="/html/2307.07924/assets/figures/designer.png" id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.g7" class="ltx_graphics ltx_img_portrait" width="17" height="22" alt="[Uncaptioned image]">
<span id="A1.p1.pic1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.13" class="ltx_p">: I am a artistic designer of ChatDev. I direct ChatDev’s creative softwares and develop the artistic design strategy that defines the company’s brand. I create the unique image or music of our producted softwares and deliver this distinctive design to consumers to create a clear brand image which is a fundamental and essential work throughout the company.</span>
</span></foreignObject></g></g></svg>
</div>
<div id="A1.p2" class="ltx_para ltx_noindent">
<svg id="A1.p2.pic1" class="ltx_picture" height="634.45" overflow="visible" version="1.1" width="600"><g transform="translate(0,634.45) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 628.54 C 0 631.8 2.64 634.45 5.91 634.45 L 594.09 634.45 C 597.36 634.45 600 631.8 600 628.54 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 610.33 L 598.03 610.33 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 529.41 L 598.03 529.41" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 616.24)"><foreignObject width="556.69" height="12.3" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p2.pic1.14.14.14.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p2.pic1.14.14.14.1.1.1" class="ltx_p">Designing: Modality and Language</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 541.22)"><foreignObject width="556.69" height="57.3" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p2.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p2.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1" class="ltx_p">: CEO (Chief Executive Officer)
 <img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p2.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]">: CPO (Chief Product Officer)</span><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p2.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.g2" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p2.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2" class="ltx_p">: CTO (Chief Technology Officer)</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="503.82" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.9" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.10" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p2.pic1.4.4.4.4.4.4.4.4.4.4.4.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p2.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.4" class="ltx_p">To satisfy the new user’s demand and the product should be realizable via the python programming language, you should keep discussing with me to decide which product modality do we want the product to be? Once we all have expressed our opinion(s) and agree with the results of the discussion unanimously, any of us must actively terminate the discussion by replying with a single word &lt;END&gt;, followed by our final product modality, <span id="A1.p2.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.4.1" class="ltx_text ltx_font_italic">e.g., </span>“&lt;END&gt; PowerPoint”.
<span id="A1.p2.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.4.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p2.pic1.5.5.5.5.5.5.5.5.5.5.5.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]"> I suggest we design the Gomoku game as a desktop application. This modality will allow us to implement a visualized game that can be played on a computer. It will provide a user-friendly interface and an interactive gaming experience. Additionally, developing the game as a desktop application will leverage our expertise in programming and ensure that the product is realizable using the Python programming language.
<span id="A1.p2.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.4.3" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p2.pic1.6.6.6.6.6.6.6.6.6.6.6.3.3.3.3.3.3.2.g2" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]"> I appreciate your initiative and I agree with your suggestion to design the Gomoku game as a desktop application. This modality aligns with our expertise and allows us to create a visually appealing and interactive game for our users. By leveraging the object-oriented programming language, we can ensure that the product is realizable and maintainable in the long run. Let’s proceed with developing the Gomoku game as a desktop application.
<span id="A1.p2.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.4.4" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p2.pic1.7.7.7.7.7.7.7.7.7.7.7.4.4.4.4.4.4.3.g3" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]"> Great! I’m glad we’re aligned on developing the Gomoku game as a desktop application.
<span id="A1.p2.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.4.5" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p2.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.4.g4" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]"> &lt;END&gt; Desktop Application.</span>
<span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.11" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;background:black;display:inline-block;"> </span></span><span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.12" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.13" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p2.pic1.9.9.9.9.9.9.9.9.9.9.9.6.6.6.6.6.6.g2" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.8" class="ltx_p">To satisfy the new user’s demand and make a <span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.8.1" class="ltx_text ltx_framed ltx_framed_underline">desktop application</span> realizable, you should propose a concrete programming language.
<span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.8.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p2.pic1.10.10.10.10.10.10.10.10.10.10.10.7.7.7.7.7.7.5.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]"> Python with the Pygame library is a suitable choice for implementing a basic Gomoku game.
<span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.8.3" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p2.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.6.g2" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]"> Great! Python is a versatile and widely-used programming language that will be suitable for implementing a basic Gomoku game. Its simplicity and readability make it a popular choice for beginners and experienced developers alike.
<span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.8.4" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p2.pic1.12.12.12.12.12.12.12.12.12.12.12.9.9.9.9.9.9.7.g3" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]"> Let’s get started with the development of the basic Gomoku game in Python using the Pygame library!
<span id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.8.5" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p2.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.8.g4" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]"> &lt;END&gt; Python.</span>
</span></foreignObject></g></g></svg>
</div>
<div id="A1.p3" class="ltx_para ltx_noindent">
<svg id="A1.p3.pic1" class="ltx_picture" height="566.27" overflow="visible" version="1.1" width="600"><g transform="translate(0,566.27) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 560.36 C 0 563.63 2.64 566.27 5.91 566.27 L 594.09 566.27 C 597.36 566.27 600 563.63 600 560.36 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 540.62 L 598.03 540.62 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 490.54 L 598.03 490.54" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 546.53)"><foreignObject width="556.69" height="13.84" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p3.pic1.19.19.19.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p3.pic1.19.19.19.1.1.1" class="ltx_p">Designing: Brainstorm (via Self-Reflection)</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 502.35)"><foreignObject width="556.69" height="26.46" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p3.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p3.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p3.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2" class="ltx_p">: CEO (Chief Executive Officer)
 <img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p3.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]">: CPO (Chief Product Officer)  <img src="/html/2307.07924/assets/figures/ceo_50percent.png" id="A1.p3.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.g2" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">: Pseudo Self</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="464.95" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.9" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.10" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p3.pic1.4.4.4.4.4.4.4.4.4.4.4.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.11" class="ltx_p">To satisfy the new user’s demand and let our designed software further surprizes the user, you should propose three fantastic ideas to make the <span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.11.1" class="ltx_text ltx_framed ltx_framed_underline">desktop application</span> more creative and imaginative via <span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.11.2" class="ltx_text ltx_framed ltx_framed_underline">Python</span>.</span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.12" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p3.pic1.5.5.5.5.5.5.5.5.5.5.5.2.2.2.2.2.2.g2" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]">
<span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.13" class="ltx_p">Here are three fantastic ideas to make the Gomoku game software more creative and imaginative:</span>
<span id="A1.I1" class="ltx_enumerate">
<span id="A1.I1.i1" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I1.i1.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I1.i1.1.1.m1.1b"><mo id="A1.I1.i1.1.1.m1.1.1" xref="A1.I1.i1.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I1.i1.1.1.m1.1c"><ci id="A1.I1.i1.1.1.m1.1.1.cmml" xref="A1.I1.i1.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I1.i1.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I1.i1.p1" class="ltx_para">
<span id="A1.I1.i1.p1.1" class="ltx_p">Theme Customization: Allow users to customize the theme of the game board and pieces.</span>
</span></span>
<span id="A1.I1.i2" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I1.i2.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I1.i2.1.1.m1.1b"><mo id="A1.I1.i2.1.1.m1.1.1" xref="A1.I1.i2.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I1.i2.1.1.m1.1c"><ci id="A1.I1.i2.1.1.m1.1.1.cmml" xref="A1.I1.i2.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I1.i2.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I1.i2.p1" class="ltx_para">
<span id="A1.I1.i2.p1.1" class="ltx_p">Avatar Selection: Introduce a feature that allows users to select and customize their own avatars to represent them in the game.</span>
</span></span>
<span id="A1.I1.i3" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I1.i3.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I1.i3.1.1.m1.1b"><mo id="A1.I1.i3.1.1.m1.1.1" xref="A1.I1.i3.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I1.i3.1.1.m1.1c"><ci id="A1.I1.i3.1.1.m1.1.1.cmml" xref="A1.I1.i3.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I1.i3.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I1.i3.p1" class="ltx_para ltx_noindent">
<span id="A1.I1.i3.p1.1" class="ltx_p">Special Moves: Incorporate special moves that players can unlock or earn during the game.</span>
</span></span>
</span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.14" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p3.pic1.6.6.6.6.6.6.6.6.6.6.6.3.3.3.3.3.3.g3" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.15" class="ltx_p">To implement these ideas, we can incorporate the following features into the software: providing a theme selection menu where users can choose from a variety of visually appealing themes; and allowing users to customize their avatars’ appearance, such as changing hairstyles, outfits, and accessories.
By incorporating these features, we can create a Gomoku game software that not only provides an engaging gameplay experience but also allows users to express their creativity and imagination.</span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.16" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p3.pic1.7.7.7.7.7.7.7.7.7.7.7.4.4.4.4.4.4.g4" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]">
<span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.17" class="ltx_p">To proceed with the implementation, we will need to assign a development team to work on the software. We will create a project plan, allocate resources, and set milestones to track the progress.
Once the software is developed, we can conduct thorough testing to ensure its functionality, performance, and user experience meet the highest standards. We will also create documentation to users to ensure a seamless experience.</span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.18" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p3.pic1.8.8.8.8.8.8.8.8.8.8.8.5.5.5.5.5.5.g5" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.19" class="ltx_p">I appreciate your thorough approach to the implementation of the proposed features.</span>
<span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.20" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;background:black;display:inline-block;"> </span></span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.21" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.22" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo_50percent.png" id="A1.p3.pic1.9.9.9.9.9.9.9.9.9.9.9.6.6.6.6.6.6.g6" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8" class="ltx_p">Here is a dialogue between CPO and me:
“<img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p3.pic1.10.10.10.10.10.10.10.10.10.10.10.7.7.7.7.7.7.1.g1" class="ltx_graphics ltx_img_portrait" width="12" height="15" alt="[Uncaptioned image]">: <math id="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1a"><mi mathvariant="normal" id="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1.1" xref="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1b"><ci id="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1.1.cmml" xref="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p3.pic1.11.11.11.11.11.11.11.11.11.11.11.8.8.8.8.8.8.2.m1.1c">\cdots</annotation></semantics></math>  <img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p3.pic1.12.12.12.12.12.12.12.12.12.12.12.9.9.9.9.9.9.3.g2" class="ltx_graphics ltx_img_square" width="12" height="14" alt="[Uncaptioned image]">: <math id="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1a"><mi mathvariant="normal" id="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1.1" xref="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1b"><ci id="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1.1.cmml" xref="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p3.pic1.13.13.13.13.13.13.13.13.13.13.13.10.10.10.10.10.10.4.m2.1c">\cdots</annotation></semantics></math>  <img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p3.pic1.14.14.14.14.14.14.14.14.14.14.14.11.11.11.11.11.11.5.g3" class="ltx_graphics ltx_img_portrait" width="12" height="15" alt="[Uncaptioned image]">: <math id="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1a"><mi mathvariant="normal" id="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1.1" xref="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1b"><ci id="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1.1.cmml" xref="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p3.pic1.15.15.15.15.15.15.15.15.15.15.15.12.12.12.12.12.12.6.m3.1c">\cdots</annotation></semantics></math>  <img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p3.pic1.16.16.16.16.16.16.16.16.16.16.16.13.13.13.13.13.13.7.g4" class="ltx_graphics ltx_img_square" width="12" height="14" alt="[Uncaptioned image]">: <math id="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1a"><mi mathvariant="normal" id="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1.1" xref="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1b"><ci id="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1.1.cmml" xref="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p3.pic1.17.17.17.17.17.17.17.17.17.17.17.14.14.14.14.14.14.8.m4.1c">\cdots</annotation></semantics></math>”. Conclude three most creative and imaginative brainstorm ideas from the whole discussion.</span><span id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.23" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p3.pic1.18.18.18.18.18.18.18.18.18.18.18.15.15.15.15.15.15.g7" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.I2" class="ltx_enumerate">
<span id="A1.I2.i1" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item">1.</span> 
<span id="A1.I2.i1.p1" class="ltx_para">
<span id="A1.I2.i1.p1.1" class="ltx_p">Theme Customization: Allow users to customize the theme of the game board and pieces.</span>
</span></span>
<span id="A1.I2.i2" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item">2.</span> 
<span id="A1.I2.i2.p1" class="ltx_para">
<span id="A1.I2.i2.p1.1" class="ltx_p">Avatar Selection: Introduce a feature that allows users to select and customize their own avatars to represent them in the game.</span>
</span></span>
<span id="A1.I2.i3" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item">3.</span> 
<span id="A1.I2.i3.p1" class="ltx_para ltx_noindent">
<span id="A1.I2.i3.p1.1" class="ltx_p">Power-Ups and Special Moves: Incorporate power-ups and special moves that players can unlock or earn during the game.</span>
</span></span>
</span>
</span></foreignObject></g></g></svg>
</div>
<div id="A1.p4" class="ltx_para ltx_noindent">
<svg id="A1.p4.pic1" class="ltx_picture" height="6500.9" overflow="visible" version="1.1" width="600"><g transform="translate(0,6500.9) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 6495 C 0 6498.26 2.64 6500.9 5.91 6500.9 L 594.09 6500.9 C 597.36 6500.9 600 6498.26 600 6495 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 6476.79 L 598.03 6476.79 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 6423.71 L 598.03 6423.71" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 6482.7)"><foreignObject width="556.69" height="12.3" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p4.pic1.10.10.10.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p4.pic1.10.10.10.1.1.1" class="ltx_p">Coding: Code Generation</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 6435.52)"><foreignObject width="556.69" height="29.46" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p4.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p4.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p4.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1" class="ltx_p">: CTO (Chief Technology Officer)
 <img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p4.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">: Programmer</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="6398.12" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000"><span id="A1.p4.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.2" class="ltx_inline-logical-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3" class="ltx_para"><span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3.1" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p4.pic1.3.3.3.3.3.3.3.3.3.3.3.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3.3" class="ltx_p">We have decided to complete the task through a executable software with multiple files implemented via <span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3.3.1" class="ltx_text ltx_framed ltx_framed_underline">Python</span>. You should write one or multiple files and make sure that every detail of the architecture is implemented as code. The software should be equiped with graphical user interface (GUI); so you must choose a suitable GUI framework.
Think step by step and reason yourself to the right decisions to make sure we get it right.
You will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.</span><span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3.4" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p4.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.g2" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3.5" class="ltx_p">To design a basic Gomoku game in Python with a GUI, we will need the following core classes, functions, and methods:</span>
<span id="A1.I3" class="ltx_enumerate">
<span id="A1.I3.i1" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I3.i1.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I3.i1.1.1.m1.1b"><mo id="A1.I3.i1.1.1.m1.1.1" xref="A1.I3.i1.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I3.i1.1.1.m1.1c"><ci id="A1.I3.i1.1.1.m1.1.1.cmml" xref="A1.I3.i1.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I3.i1.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I3.i1.p1" class="ltx_para">
<span id="A1.I3.i1.p1.1" class="ltx_p">Board: This class represents the game board and handles the logic for placing and checking moves.</span>
</span></span>
<span id="A1.I3.i2" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I3.i2.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I3.i2.1.1.m1.1b"><mo id="A1.I3.i2.1.1.m1.1.1" xref="A1.I3.i2.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I3.i2.1.1.m1.1c"><ci id="A1.I3.i2.1.1.m1.1.1.cmml" xref="A1.I3.i2.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I3.i2.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I3.i2.p1" class="ltx_para">
<span id="A1.I3.i2.p1.1" class="ltx_p">Game: This class manages the game flow and user interactions.</span>
</span></span>
<span id="A1.I3.i3" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I3.i3.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I3.i3.1.1.m1.1b"><mo id="A1.I3.i3.1.1.m1.1.1" xref="A1.I3.i3.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I3.i3.1.1.m1.1c"><ci id="A1.I3.i3.1.1.m1.1.1.cmml" xref="A1.I3.i3.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I3.i3.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I3.i3.p1" class="ltx_para ltx_noindent">
<span id="A1.I3.i3.p1.1" class="ltx_p">GUI: This class handles the graphical user interface using a GUI framework (e.g., tkinter).</span>
</span></span>
</span>
<span id="A1.p4.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p3.6" class="ltx_p">Now, let’s proceed with the implementation of each file.</span>
</span>
<span id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1" class="ltx_para ltx_noindent"><svg id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1" class="ltx_picture" height="3330.66" overflow="visible" version="1.1" width="401.57"><g transform="translate(0,3330.66) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#006666" fill-opacity="1.0"><path d="M 0 0.69 L 0 3329.97 C 0 3330.35 0.31 3330.66 0.69 3330.66 L 400.88 3330.66 C 401.26 3330.66 401.57 3330.35 401.57 3329.97 L 401.57 0.69 C 401.57 0.31 401.26 0 400.88 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 3312.75 L 400.88 3312.75 L 400.88 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 3317.38)"><foreignObject width="360.82" height="8.65" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:260.8pt;">
<span id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.2.2.2.1.1.1" class="ltx_p"><span id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.2.2.2.1.1.1.1" class="ltx_text ltx_font_bold">game.py</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="360.82" height="3288.44" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:260.8pt;">
<span id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2" class="ltx_listing ltx_lst_language_Python ltx_lstlisting ltx_listing"><span class="ltx_listing_data"><a href="data:text/plain;base64,Y2xhc3MgR2FtZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmJvYXJkID0gW1swXSAqIDE1IGZvciBfIGluIHJhbmdlKDE1KV0KICAgICAgICBzZWxmLmN1cnJlbnRfcGxheWVyID0gMQogICAgICAgIHNlbGYuZ2FtZV9vdmVyID0gRmFsc2UKICAgIGRlZiBtYWtlX21vdmUoc2VsZiwgcm93LCBjb2wpOgogICAgICAgIGlmIHNlbGYuYm9hcmRbcm93XVtjb2xdICE9IDAgb3Igc2VsZi5nYW1lX292ZXI6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuYm9hcmRbcm93XVtjb2xdID0gc2VsZi5jdXJyZW50X3BsYXllcgogICAgICAgIGlmIHNlbGYuY2hlY2tfd2luKHJvdywgY29sKToKICAgICAgICAgICAgc2VsZi5nYW1lX292ZXIgPSBUcnVlCiAgICAgICAgZWxpZiBzZWxmLmlzX2JvYXJkX2Z1bGwoKToKICAgICAgICAgICAgc2VsZi5nYW1lX292ZXIgPSBUcnVlCiAgICAgICAgc2VsZi5jdXJyZW50X3BsYXllciA9IDMgLSBzZWxmLmN1cnJlbnRfcGxheWVy" download="">⬇</a></span>
<span id="lstnumberx1" class="ltx_listingline"><span id="lstnumberx1.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">class</span><span id="lstnumberx1.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx1.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">Game</span><span id="lstnumberx1.4" class="ltx_text ltx_font_typewriter">:</span>
</span>
<span id="lstnumberx2" class="ltx_listingline"><span id="lstnumberx2.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx2.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx2.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx2.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">__init__</span><span id="lstnumberx2.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx2.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx2.7" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx3" class="ltx_listingline"><span id="lstnumberx3.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx3.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx3.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx3.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board</span><span id="lstnumberx3.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx3.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.8" class="ltx_text ltx_font_typewriter">[[0]</span><span id="lstnumberx3.9" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.10" class="ltx_text ltx_font_typewriter">*</span><span id="lstnumberx3.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.12" class="ltx_text ltx_font_typewriter">15</span><span id="lstnumberx3.13" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.14" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx3.15" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.16" class="ltx_text ltx_lst_identifier ltx_font_typewriter">_</span><span id="lstnumberx3.17" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.18" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx3.19" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx3.20" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx3.21" class="ltx_text ltx_font_typewriter">(15)]</span>
</span>
<span id="lstnumberx4" class="ltx_listingline"><span id="lstnumberx4.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx4.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx4.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx4.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">current_player</span><span id="lstnumberx4.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx4.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx4.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx4.8" class="ltx_text ltx_font_typewriter">1</span>
</span>
<span id="lstnumberx5" class="ltx_listingline"><span id="lstnumberx5.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx5.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx5.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx5.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game_over</span><span id="lstnumberx5.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx5.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx5.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx5.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">False</span>
</span>
<span id="lstnumberx6" class="ltx_listingline"><span id="lstnumberx6.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx6.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx6.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx6.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">make_move</span><span id="lstnumberx6.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx6.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx6.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx6.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx6.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx6.10" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx6.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx6.12" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx6.13" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx7" class="ltx_listingline"><span id="lstnumberx7.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx7.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">if</span><span id="lstnumberx7.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx7.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx7.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx7.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board</span><span id="lstnumberx7.7" class="ltx_text ltx_font_typewriter">[</span><span id="lstnumberx7.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx7.9" class="ltx_text ltx_font_typewriter">][</span><span id="lstnumberx7.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx7.11" class="ltx_text ltx_font_typewriter">]</span><span id="lstnumberx7.12" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx7.13" class="ltx_text ltx_font_typewriter">!=</span><span id="lstnumberx7.14" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx7.15" class="ltx_text ltx_font_typewriter">0</span><span id="lstnumberx7.16" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx7.17" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">or</span><span id="lstnumberx7.18" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx7.19" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx7.20" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx7.21" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game_over</span><span id="lstnumberx7.22" class="ltx_text ltx_font_typewriter">:</span>
</span>
<span id="lstnumberx8" class="ltx_listingline"><span id="lstnumberx8.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx8.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">return</span>
</span>
<span id="lstnumberx9" class="ltx_listingline"><span id="lstnumberx9.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx9.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx9.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx9.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board</span><span id="lstnumberx9.5" class="ltx_text ltx_font_typewriter">[</span><span id="lstnumberx9.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx9.7" class="ltx_text ltx_font_typewriter">][</span><span id="lstnumberx9.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx9.9" class="ltx_text ltx_font_typewriter">]</span><span id="lstnumberx9.10" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx9.11" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx9.12" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx9.13" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx9.14" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx9.15" class="ltx_text ltx_lst_identifier ltx_font_typewriter">current_player</span>
</span>
<span id="lstnumberx10" class="ltx_listingline"><span id="lstnumberx10.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx10.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">if</span><span id="lstnumberx10.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx10.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx10.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx10.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">check_win</span><span id="lstnumberx10.7" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx10.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx10.9" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx10.10" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx10.11" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx10.12" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx11" class="ltx_listingline"><span id="lstnumberx11.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx11.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx11.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx11.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game_over</span><span id="lstnumberx11.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx11.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx11.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx11.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">True</span>
</span>
<span id="lstnumberx12" class="ltx_listingline"><span id="lstnumberx12.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx12.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">elif</span><span id="lstnumberx12.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx12.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx12.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx12.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">is_board_full</span><span id="lstnumberx12.7" class="ltx_text ltx_font_typewriter">():</span>
</span>
<span id="lstnumberx13" class="ltx_listingline"><span id="lstnumberx13.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx13.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx13.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx13.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game_over</span><span id="lstnumberx13.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx13.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx13.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx13.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">True</span>
</span>
<span id="lstnumberx14" class="ltx_listingline"><span id="lstnumberx14.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx14.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx14.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx14.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">current_player</span><span id="lstnumberx14.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx14.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx14.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx14.8" class="ltx_text ltx_font_typewriter">3</span><span id="lstnumberx14.9" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx14.10" class="ltx_text ltx_font_typewriter">-</span><span id="lstnumberx14.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx14.12" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx14.13" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx14.14" class="ltx_text ltx_lst_identifier ltx_font_typewriter">current_player</span>
</span>
</span>
<span id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_p"><math id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1a"><mi mathvariant="normal" id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1" xref="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1b"><ci id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml" xref="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p4.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></foreignObject></g></g></svg>
</span>
<span id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2" class="ltx_para ltx_noindent"><svg id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1" class="ltx_picture" height="2869.02" overflow="visible" version="1.1" width="401.57"><g transform="translate(0,2869.02) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#006666" fill-opacity="1.0"><path d="M 0 0.69 L 0 2868.33 C 0 2868.71 0.31 2869.02 0.69 2869.02 L 400.88 2869.02 C 401.26 2869.02 401.57 2868.71 401.57 2868.33 L 401.57 0.69 C 401.57 0.31 401.26 0 400.88 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 2847.83 L 400.88 2847.83 L 400.88 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 2852.46)"><foreignObject width="360.82" height="11.93" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:260.8pt;">
<span id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.2.2.2.1.1.1" class="ltx_p"><span id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.2.2.2.1.1.1.1" class="ltx_text ltx_font_bold">gui.py</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="360.82" height="2823.52" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:260.8pt;">
<span id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2" class="ltx_listing ltx_lst_language_Python ltx_lstlisting ltx_listing"><span class="ltx_listing_data"><a href="data:text/plain;base64,Y2xhc3MgR1VJOgogICAgZGVmIGNyZWF0ZV9ib2FyZChzZWxmKToKICAgICAgICBzZWxmLmJvYXJkX2ZyYW1lID0gdGsuRnJhbWUoc2VsZi53aW5kb3cpCiAgICAgICAgc2VsZi5ib2FyZF9mcmFtZS5wYWNrKCkKICAgICAgICBmb3Igcm93IGluIHJhbmdlKDE1KToKICAgICAgICAgICAgcm93X2J1dHRvbnMgPSBbXQogICAgICAgICAgICBmb3IgY29sIGluIHJhbmdlKDE1KToKICAgICAgICAgICAgICAgIGJ1dHRvbiA9IHRrLkJ1dHRvbih3aWR0aD01MCwgaGVpZ2h0PTUwKQogICAgICAgICAgICAgICAgYnV0dG9uLmdyaWQocm93PXJvdywgY29sdW1uPWNvbCkKICAgICAgICAgICAgICAgIHJvd19idXR0b25zLmFwcGVuZChidXR0b24pCiAgICAgICAgICAgIHNlbGYuYnV0dG9ucy5hcHBlbmQocm93X2J1dHRvbnMpCiAgICAgICAgc2VsZi51cGRhdGVfYm9hcmRfZ3VpKCkKICAgIGRlZiBpc19nYW1lX292ZXIoc2VsZiwgcmVzdWx0KToKICAgICAgICBwYXNz" download="">⬇</a></span>
<span id="lstnumberx15" class="ltx_listingline"><span id="lstnumberx15.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">class</span><span id="lstnumberx15.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx15.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GUI</span><span id="lstnumberx15.4" class="ltx_text ltx_font_typewriter">:</span>
</span>
<span id="lstnumberx16" class="ltx_listingline"><span id="lstnumberx16.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx16.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx16.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx16.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">create_board</span><span id="lstnumberx16.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx16.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx16.7" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx17" class="ltx_listingline"><span id="lstnumberx17.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx17.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx17.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx17.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board_frame</span><span id="lstnumberx17.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx17.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx17.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx17.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">tk</span><span id="lstnumberx17.9" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx17.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">Frame</span><span id="lstnumberx17.11" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx17.12" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx17.13" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx17.14" class="ltx_text ltx_lst_identifier ltx_font_typewriter">window</span><span id="lstnumberx17.15" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx18" class="ltx_listingline"><span id="lstnumberx18.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx18.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx18.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx18.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board_frame</span><span id="lstnumberx18.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx18.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">pack</span><span id="lstnumberx18.7" class="ltx_text ltx_font_typewriter">()</span>
</span>
<span id="lstnumberx19" class="ltx_listingline"><span id="lstnumberx19.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx19.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx19.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx19.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx19.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx19.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx19.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx19.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx19.9" class="ltx_text ltx_font_typewriter">(15):</span>
</span>
<span id="lstnumberx20" class="ltx_listingline"><span id="lstnumberx20.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx20.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row_buttons</span><span id="lstnumberx20.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx20.4" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx20.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx20.6" class="ltx_text ltx_font_typewriter">[]</span>
</span>
<span id="lstnumberx21" class="ltx_listingline"><span id="lstnumberx21.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx21.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx21.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx21.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx21.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx21.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx21.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx21.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx21.9" class="ltx_text ltx_font_typewriter">(15):</span>
</span>
<span id="lstnumberx22" class="ltx_listingline"><span id="lstnumberx22.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                </span><span id="lstnumberx22.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">button</span><span id="lstnumberx22.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx22.4" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx22.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx22.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">tk</span><span id="lstnumberx22.7" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx22.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">Button</span><span id="lstnumberx22.9" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx22.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">width</span><span id="lstnumberx22.11" class="ltx_text ltx_font_typewriter">=50,</span><span id="lstnumberx22.12" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx22.13" class="ltx_text ltx_lst_identifier ltx_font_typewriter">height</span><span id="lstnumberx22.14" class="ltx_text ltx_font_typewriter">=50)</span>
</span>
<span id="lstnumberx23" class="ltx_listingline"><span id="lstnumberx23.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                </span><span id="lstnumberx23.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">button</span><span id="lstnumberx23.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx23.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">grid</span><span id="lstnumberx23.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx23.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx23.7" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx23.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx23.9" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx23.10" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx23.11" class="ltx_text ltx_lst_identifier ltx_font_typewriter">column</span><span id="lstnumberx23.12" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx23.13" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx23.14" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx24" class="ltx_listingline"><span id="lstnumberx24.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                </span><span id="lstnumberx24.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row_buttons</span><span id="lstnumberx24.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx24.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">append</span><span id="lstnumberx24.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx24.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">button</span><span id="lstnumberx24.7" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx25" class="ltx_listingline"><span id="lstnumberx25.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx25.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx25.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx25.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">buttons</span><span id="lstnumberx25.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx25.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">append</span><span id="lstnumberx25.7" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx25.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row_buttons</span><span id="lstnumberx25.9" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx26" class="ltx_listingline"><span id="lstnumberx26.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx26.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx26.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx26.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">update_board_gui</span><span id="lstnumberx26.5" class="ltx_text ltx_font_typewriter">()</span>
</span>
<span id="lstnumberx27" class="ltx_listingline"><span id="lstnumberx27.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx27.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx27.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx27.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">is_game_over</span><span id="lstnumberx27.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx27.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx27.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx27.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx27.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">result</span><span id="lstnumberx27.10" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx28" class="ltx_listingline"><span id="lstnumberx28.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx28.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">pass</span>
</span>
</span>
<span id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_p"><math id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1a"><mi mathvariant="normal" id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1" xref="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1b"><ci id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml" xref="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p4.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></foreignObject></g></g></svg>
</span>
<span id="A1.p4.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.2.p4" class="ltx_para">
<span id="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1" class="ltx_p"><math id="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1a"><mi mathvariant="normal" id="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1.1" xref="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1b"><ci id="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1.1.cmml" xref="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p4.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></span></foreignObject></g></g></svg>
</div>
<div id="A1.p5" class="ltx_para ltx_noindent">
<svg id="A1.p5.pic1" class="ltx_picture" height="4876.91" overflow="visible" version="1.1" width="600"><g transform="translate(0,4876.91) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 4871 C 0 4874.26 2.64 4876.91 5.91 4876.91 L 594.09 4876.91 C 597.36 4876.91 600 4874.26 600 4871 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 4852.8 L 598.03 4852.8 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 4800.48 L 598.03 4800.48" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 4858.7)"><foreignObject width="556.69" height="12.3" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p5.pic1.14.14.14.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p5.pic1.14.14.14.1.1.1" class="ltx_p">Coding: GUI Design</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 4812.3)"><foreignObject width="556.69" height="28.69" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p5.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p5.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p5.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1" class="ltx_p">: Programmer  <img src="/html/2307.07924/assets/figures/designer.png" id="A1.p5.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="22" alt="[Uncaptioned image]">: Designer</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="4774.89" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000"><span id="A1.p5.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.3" class="ltx_inline-logical-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p5.pic1.11.11.11.11.11.11.11.11.11.11.11.9.9.9.9.9.9.1.p3" class="ltx_para"><span id="A1.p5.pic1.11.11.11.11.11.11.11.11.11.11.11.9.9.9.9.9.9.1.p3.1" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p5.pic1.11.11.11.11.11.11.11.11.11.11.11.9.9.9.9.9.9.1.p3.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/designer.png" id="A1.p5.pic1.3.3.3.3.3.3.3.3.3.3.3.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="22" alt="[Uncaptioned image]">
<span id="A1.p5.pic1.11.11.11.11.11.11.11.11.11.11.11.9.9.9.9.9.9.1.p3.3" class="ltx_p">To equip the software with a beautiful graphical user interface, we will discuss and design many decorative images for GUI decoration. Now, we, according to the codes, keep discussing the GUI beautification by listing some functionally independent elements in GUI that are being considered to be decorated by different pictures.</span>
</span>
<span id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1" class="ltx_para ltx_noindent"><svg id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1" class="ltx_picture" height="2188.24" overflow="visible" version="1.1" width="401.57"><g transform="translate(0,2188.24) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#006666" fill-opacity="1.0"><path d="M 0 0.69 L 0 2187.55 C 0 2187.93 0.31 2188.24 0.69 2188.24 L 400.88 2188.24 C 401.26 2188.24 401.57 2187.93 401.57 2187.55 L 401.57 0.69 C 401.57 0.31 401.26 0 400.88 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 2167.05 L 400.88 2167.05 L 400.88 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 2171.68)"><foreignObject width="360.82" height="11.93" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:260.8pt;">
<span id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.2.2.2.1.1.1" class="ltx_p"><span id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.2.2.2.1.1.1.1" class="ltx_text ltx_font_bold">gui.py</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="360.82" height="2142.74" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:260.8pt;">
<span id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2" class="ltx_listing ltx_lst_language_Python ltx_lstlisting ltx_listing"><span class="ltx_listing_data"><a href="data:text/plain;base64,Y2xhc3MgR1VJOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGdhbWUpOgogICAgICAgIHBsYXllcl9vID0gc3RyKCJPIikKICAgICAgICBwbGF5ZXJfeCA9IHN0cigiWCIpCiAgICBkZWYgbWFrZV9tb3ZlKHNlbGYsIHJvdywgY29sKToKICAgICAgICBzZWxmLmdhbWUucGxheV9tb3ZlKHJvdywgY29sKQogICAgICAgIHNlbGYuYnV0dG9uc1tyb3ddW2NvbF0uY29uZmlnKCJYIgogICAgICAgIGlmIHNlbGYuZ2FtZS5jdXJyZW50X3BsYXllciA9PSAnWCcgZWxzZSAiTyIpCiAgICBkZWYgaXNfZ2FtZV9vdmVyKHNlbGYsIHJlc3VsdCk6CiAgICAgICAgcGFzcw==" download="">⬇</a></span>
<span id="lstnumberx29" class="ltx_listingline"><span id="lstnumberx29.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">class</span><span id="lstnumberx29.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx29.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GUI</span><span id="lstnumberx29.4" class="ltx_text ltx_font_typewriter">:</span>
</span>
<span id="lstnumberx30" class="ltx_listingline"><span id="lstnumberx30.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx30.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx30.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx30.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">__init__</span><span id="lstnumberx30.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx30.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx30.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx30.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx30.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game</span><span id="lstnumberx30.10" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx31" class="ltx_listingline"><span id="lstnumberx31.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx31.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">player_o</span><span id="lstnumberx31.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx31.4" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx31.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx31.6" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">str</span><span id="lstnumberx31.7" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx31.8" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"O"</span><span id="lstnumberx31.9" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx32" class="ltx_listingline"><span id="lstnumberx32.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx32.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">player_x</span><span id="lstnumberx32.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx32.4" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx32.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx32.6" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">str</span><span id="lstnumberx32.7" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx32.8" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"X"</span><span id="lstnumberx32.9" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx33" class="ltx_listingline"><span id="lstnumberx33.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx33.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx33.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx33.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">make_move</span><span id="lstnumberx33.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx33.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx33.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx33.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx33.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx33.10" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx33.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx33.12" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx33.13" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx34" class="ltx_listingline"><span id="lstnumberx34.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx34.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx34.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx34.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game</span><span id="lstnumberx34.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx34.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">play_move</span><span id="lstnumberx34.7" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx34.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx34.9" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx34.10" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx34.11" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx34.12" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx35" class="ltx_listingline"><span id="lstnumberx35.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx35.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx35.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx35.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">buttons</span><span id="lstnumberx35.5" class="ltx_text ltx_font_typewriter">[</span><span id="lstnumberx35.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx35.7" class="ltx_text ltx_font_typewriter">][</span><span id="lstnumberx35.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx35.9" class="ltx_text ltx_font_typewriter">].</span><span id="lstnumberx35.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">config</span><span id="lstnumberx35.11" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx35.12" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"X"</span>
</span>
<span id="lstnumberx36" class="ltx_listingline"><span id="lstnumberx36.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx36.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">if</span><span id="lstnumberx36.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx36.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx36.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx36.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game</span><span id="lstnumberx36.7" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx36.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">current_player</span><span id="lstnumberx36.9" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx36.10" class="ltx_text ltx_font_typewriter">==</span><span id="lstnumberx36.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx36.12" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">’X’</span><span id="lstnumberx36.13" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx36.14" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">else</span><span id="lstnumberx36.15" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx36.16" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"O"</span><span id="lstnumberx36.17" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx37" class="ltx_listingline"><span id="lstnumberx37.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx37.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx37.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx37.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">is_game_over</span><span id="lstnumberx37.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx37.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx37.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx37.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx37.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">result</span><span id="lstnumberx37.10" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx38" class="ltx_listingline"><span id="lstnumberx38.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx38.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">pass</span>
</span>
</span>
<span id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_p"><math id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1a"><mi mathvariant="normal" id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1" xref="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1b"><ci id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml" xref="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p5.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></foreignObject></g></g></svg>
</span>
<span id="A1.p5.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.2.p4" class="ltx_para">
<span id="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1" class="ltx_p"><math id="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1a"><mi mathvariant="normal" id="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1.1" xref="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1b"><ci id="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1.1.cmml" xref="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p5.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.1.m1.1c">\cdots</annotation></semantics></math></span><span id="A1.p5.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.2.p4.1" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p5.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.g2" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.I4" class="ltx_enumerate">
<span id="A1.I4.i1" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I4.i1.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I4.i1.1.1.m1.1b"><mo id="A1.I4.i1.1.1.m1.1.1" xref="A1.I4.i1.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I4.i1.1.1.m1.1c"><ci id="A1.I4.i1.1.1.m1.1.1.cmml" xref="A1.I4.i1.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I4.i1.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I4.i1.p1" class="ltx_para">
<span id="A1.I4.i1.p1.1" class="ltx_p"><span id="A1.I4.i1.p1.1.1" class="ltx_text ltx_font_typewriter">board.png</span>: The game board where players make their moves.</span>
</span></span>
<span id="A1.I4.i2" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I4.i2.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I4.i2.1.1.m1.1b"><mo id="A1.I4.i2.1.1.m1.1.1" xref="A1.I4.i2.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I4.i2.1.1.m1.1c"><ci id="A1.I4.i2.1.1.m1.1.1.cmml" xref="A1.I4.i2.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I4.i2.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I4.i2.p1" class="ltx_para">
<span id="A1.I4.i2.p1.1" class="ltx_p"><span id="A1.I4.i2.p1.1.1" class="ltx_text ltx_font_typewriter">button.png</span>: The button used to make a move on the game board.</span>
</span></span>
<span id="A1.I4.i3" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I4.i3.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I4.i3.1.1.m1.1b"><mo id="A1.I4.i3.1.1.m1.1.1" xref="A1.I4.i3.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I4.i3.1.1.m1.1c"><ci id="A1.I4.i3.1.1.m1.1.1.cmml" xref="A1.I4.i3.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I4.i3.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I4.i3.p1" class="ltx_para">
<span id="A1.I4.i3.p1.1" class="ltx_p"><span id="A1.I4.i3.p1.1.1" class="ltx_text ltx_font_typewriter">player_X.png</span>: The image representing player X.</span>
</span></span>
<span id="A1.I4.i4" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I4.i4.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I4.i4.1.1.m1.1b"><mo id="A1.I4.i4.1.1.m1.1.1" xref="A1.I4.i4.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I4.i4.1.1.m1.1c"><ci id="A1.I4.i4.1.1.m1.1.1.cmml" xref="A1.I4.i4.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I4.i4.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I4.i4.p1" class="ltx_para">
<span id="A1.I4.i4.p1.1" class="ltx_p"><span id="A1.I4.i4.p1.1.1" class="ltx_text ltx_font_typewriter">player_O.png</span>: The image representing player O.</span>
</span></span>
<span id="A1.I4.i5" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I4.i5.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I4.i5.1.1.m1.1b"><mo id="A1.I4.i5.1.1.m1.1.1" xref="A1.I4.i5.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I4.i5.1.1.m1.1c"><ci id="A1.I4.i5.1.1.m1.1.1.cmml" xref="A1.I4.i5.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I4.i5.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I4.i5.p1" class="ltx_para">
<span id="A1.I4.i5.p1.1" class="ltx_p"><span id="A1.I4.i5.p1.1.1" class="ltx_text ltx_font_typewriter">win.png</span>: The message displayed when a player wins.</span>
</span></span>
<span id="A1.I4.i6" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item"><math id="A1.I4.i6.1.1.m1.1" class="ltx_Math" alttext="\bullet" display="inline"><semantics id="A1.I4.i6.1.1.m1.1b"><mo id="A1.I4.i6.1.1.m1.1.1" xref="A1.I4.i6.1.1.m1.1.1.cmml">∙</mo><annotation-xml encoding="MathML-Content" id="A1.I4.i6.1.1.m1.1c"><ci id="A1.I4.i6.1.1.m1.1.1.cmml" xref="A1.I4.i6.1.1.m1.1.1">∙</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.I4.i6.1.1.m1.1d">\bullet</annotation></semantics></math></span> 
<span id="A1.I4.i6.p1" class="ltx_para ltx_noindent">
<span id="A1.I4.i6.p1.1" class="ltx_p"><span id="A1.I4.i6.p1.1.1" class="ltx_text ltx_font_typewriter">game_over.png</span>: The message displayed when the game is over.
use</span>
</span></span>
</span><span id="A1.p5.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.2.p4.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/designer.png" id="A1.p5.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.g3" class="ltx_graphics ltx_img_portrait" width="17" height="22" alt="[Uncaptioned image]">
<span id="A1.p5.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.2.p4.3" class="ltx_p">I have created all the pictures in the same directory as the Python files. Now, use some or all of the them into the GUI to make it more beautiful and creative.</span><span id="A1.p5.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.2.p4.4" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p5.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.g4" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p5.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.2.p4.5" class="ltx_p">To incorporate the designed images into the GUI, I have modified the ‘GUI’ class as follows:</span>
</span>
<span id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2" class="ltx_para ltx_noindent"><svg id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1" class="ltx_picture" height="2354.28" overflow="visible" version="1.1" width="440.94"><g transform="translate(0,2354.28) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#006666" fill-opacity="1.0"><path d="M 0 0.69 L 0 2353.59 C 0 2353.97 0.31 2354.28 0.69 2354.28 L 440.25 2354.28 C 440.64 2354.28 440.94 2353.97 440.94 2353.59 L 440.94 0.69 C 440.94 0.31 440.64 0 440.25 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 2333.09 L 440.25 2333.09 L 440.25 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 2337.72)"><foreignObject width="400.19" height="11.93" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:289.2pt;">
<span id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.2.2.2.1.1.1" class="ltx_p"><span id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.2.2.2.1.1.1.1" class="ltx_text ltx_font_bold">gui.py</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="400.19" height="2308.78" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:289.2pt;">
<span id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2" class="ltx_listing ltx_lst_language_Python ltx_lstlisting ltx_listing"><span class="ltx_listing_data"><a href="data:text/plain;base64,Y2xhc3MgR1VJOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGdhbWUpOgogICAgICAgIHBsYXllcl9vID0gSW1hZ2Uub3BlbigicGxheWVyX08ucG5nIikKICAgICAgICBwbGF5ZXJfeCA9IEltYWdlLm9wZW4oInBsYXllcl9YLnBuZyIpCiAgICBkZWYgbWFrZV9tb3ZlKHNlbGYsIHJvdywgY29sKToKICAgICAgICBzZWxmLmdhbWUucGxheV9tb3ZlKHJvdywgY29sKQogICAgICAgIHNlbGYuYnV0dG9uc1tyb3ddW2NvbF0uY29uZmlnKGltYWdlPXNlbGYucGxheWVyX3gKICAgICAgICBpZiBzZWxmLmdhbWUuY3VycmVudF9wbGF5ZXIgPT0gJ1gnIGVsc2Ugc2VsZi5wbGF5ZXJfbykKICAgIGRlZiBpc19nYW1lX292ZXIoc2VsZiwgcmVzdWx0KToKICAgICAgICBwYXNz" download="">⬇</a></span>
<span id="lstnumberx39" class="ltx_listingline"><span id="lstnumberx39.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">class</span><span id="lstnumberx39.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx39.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GUI</span><span id="lstnumberx39.4" class="ltx_text ltx_font_typewriter">:</span>
</span>
<span id="lstnumberx40" class="ltx_listingline"><span id="lstnumberx40.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx40.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx40.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx40.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">__init__</span><span id="lstnumberx40.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx40.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx40.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx40.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx40.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game</span><span id="lstnumberx40.10" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx41" class="ltx_listingline"><span id="lstnumberx41.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx41.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">player_o</span><span id="lstnumberx41.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx41.4" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx41.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx41.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">Image</span><span id="lstnumberx41.7" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx41.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">open</span><span id="lstnumberx41.9" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx41.10" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"player_O.png"</span><span id="lstnumberx41.11" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx42" class="ltx_listingline"><span id="lstnumberx42.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx42.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">player_x</span><span id="lstnumberx42.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx42.4" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx42.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx42.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">Image</span><span id="lstnumberx42.7" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx42.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">open</span><span id="lstnumberx42.9" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx42.10" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"player_X.png"</span><span id="lstnumberx42.11" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx43" class="ltx_listingline"><span id="lstnumberx43.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx43.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx43.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx43.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">make_move</span><span id="lstnumberx43.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx43.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx43.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx43.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx43.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx43.10" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx43.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx43.12" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx43.13" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx44" class="ltx_listingline"><span id="lstnumberx44.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx44.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx44.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx44.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game</span><span id="lstnumberx44.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx44.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">play_move</span><span id="lstnumberx44.7" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx44.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx44.9" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx44.10" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx44.11" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx44.12" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx45" class="ltx_listingline"><span id="lstnumberx45.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx45.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx45.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx45.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">buttons</span><span id="lstnumberx45.5" class="ltx_text ltx_font_typewriter">[</span><span id="lstnumberx45.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx45.7" class="ltx_text ltx_font_typewriter">][</span><span id="lstnumberx45.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx45.9" class="ltx_text ltx_font_typewriter">].</span><span id="lstnumberx45.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">config</span><span id="lstnumberx45.11" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx45.12" class="ltx_text ltx_lst_identifier ltx_font_typewriter">image</span><span id="lstnumberx45.13" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx45.14" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx45.15" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx45.16" class="ltx_text ltx_lst_identifier ltx_font_typewriter">player_x</span>
</span>
<span id="lstnumberx46" class="ltx_listingline"><span id="lstnumberx46.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx46.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">if</span><span id="lstnumberx46.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx46.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx46.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx46.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game</span><span id="lstnumberx46.7" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx46.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">current_player</span><span id="lstnumberx46.9" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx46.10" class="ltx_text ltx_font_typewriter">==</span><span id="lstnumberx46.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx46.12" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">’X’</span><span id="lstnumberx46.13" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx46.14" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">else</span><span id="lstnumberx46.15" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx46.16" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx46.17" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx46.18" class="ltx_text ltx_lst_identifier ltx_font_typewriter">player_o</span><span id="lstnumberx46.19" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx47" class="ltx_listingline"><span id="lstnumberx47.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx47.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx47.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx47.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">is_game_over</span><span id="lstnumberx47.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx47.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx47.7" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx47.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx47.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">result</span><span id="lstnumberx47.10" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx48" class="ltx_listingline"><span id="lstnumberx48.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx48.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">pass</span>
</span>
</span>
<span id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_p"><math id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1a"><mi mathvariant="normal" id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1" xref="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1b"><ci id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml" xref="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p5.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></foreignObject></g></g></svg>
</span>
<span id="A1.p5.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.3.p5" class="ltx_para">
<span id="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2" class="ltx_p"><math id="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1a"><mi mathvariant="normal" id="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1.1" xref="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1b"><ci id="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1.1.cmml" xref="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p5.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.2.m1.1c">\cdots</annotation></semantics></math></span>
<span id="A1.p5.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.3.p5.1" class="ltx_p">The modified ‘GUI’ class will load and resize the images, convert them to Tkinter-compatible format, and use them to create the GUI elements.</span>
</span></span></foreignObject></g></g></svg>
</div>
<div id="A1.p6" class="ltx_para ltx_noindent">
<svg id="A1.p6.pic1" class="ltx_picture" height="3890.46" overflow="visible" version="1.1" width="600"><g transform="translate(0,3890.46) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 3884.55 C 0 3887.82 2.64 3890.46 5.91 3890.46 L 594.09 3890.46 C 597.36 3890.46 600 3887.82 600 3884.55 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 3864.81 L 598.03 3864.81 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 3812.5 L 598.03 3812.5" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 3870.72)"><foreignObject width="556.69" height="13.84" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p6.pic1.9.9.9.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p6.pic1.9.9.9.1.1.1" class="ltx_p">Testing: Code Review (via Thought Instruction)</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 3824.31)"><foreignObject width="556.69" height="28.69" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p6.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p6.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p6.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1" class="ltx_p">: Programmer  <img src="/html/2307.07924/assets/figures/reviewer.png" id="A1.p6.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">: Reviewer</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="3786.91" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000"><span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1" class="ltx_inline-logical-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2" class="ltx_para"><span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.1" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p6.pic1.3.3.3.3.3.3.3.3.3.3.3.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.3" class="ltx_p">Review the codes detailedly, propose one comment with the highest priority about the codes, and give me instructions on how to fix.</span><span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.4" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/reviewer.png" id="A1.p6.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.g2" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.5" class="ltx_p">The highest priority comment is regarding the incomplete implementation of the <span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.5.1" class="ltx_text ltx_font_typewriter">check_winner()</span> and <span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.5.2" class="ltx_text ltx_font_typewriter">is_board_full()</span> methods in the <span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.5.3" class="ltx_text ltx_font_typewriter">GameBoard</span> class. These methods are marked with a <span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.5.4" class="ltx_text ltx_font_typewriter">TODO</span> comment and need to be implemented to determine the winner of the game and check if the game board is full.
To fix this, you need to implement the logic for both methods. Here are the instructions to do so:</span>
<span id="A1.I5" class="ltx_enumerate">
<span id="A1.I5.i1" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item">1.</span> 
<span id="A1.I5.i1.p1" class="ltx_para">
<span id="A1.I5.i1.p1.1" class="ltx_p">In the <span id="A1.I5.i1.p1.1.1" class="ltx_text ltx_font_typewriter">check_winner()</span> method, you need to implement the logic to check if there is a winning condition on the game board. This can be done by checking for five consecutive stones in a row, column, or diagonal. You can use nested loops to iterate through the board and check for these conditions. Once a winner is found, you can return the player number (1 or 2) or any other value to indicate the winner. If no winner is found, you can return <span id="A1.I5.i1.p1.1.2" class="ltx_text ltx_font_typewriter">None</span> or any other value to indicate no winner.</span>
</span></span>
<span id="A1.I5.i2" class="ltx_item" style="list-style-type:none;"><span class="ltx_tag ltx_tag_item">2.</span> 
<span id="A1.I5.i2.p1" class="ltx_para ltx_noindent">
<span id="A1.I5.i2.p1.1" class="ltx_p">In the <span id="A1.I5.i2.p1.1.1" class="ltx_text ltx_font_typewriter">is_board_full()</span> method, you need to implement the logic to check if the game board is full. This can be done by iterating through the board and checking if any cell is empty (<span id="A1.I5.i2.p1.1.2" class="ltx_text ltx_font_italic">i.e., </span>has a value of 0). If all cells are filled, you can return <span id="A1.I5.i2.p1.1.3" class="ltx_text ltx_font_typewriter">True</span> to indicate that the board is full. Otherwise, you can return <span id="A1.I5.i2.p1.1.4" class="ltx_text ltx_font_typewriter">False</span>.</span>
</span></span>
</span>
<span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.6" class="ltx_p">Once you have implemented these methods, make sure to remove the <span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.6.1" class="ltx_text ltx_font_typewriter">pass</span> statement from both methods.</span>
<span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.7" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;background:black;display:inline-block;"> </span></span><span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.8" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.9" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/reviewer.png" id="A1.p6.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.g3" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.10" class="ltx_p">Modify corresponding codes according to the above-mentioned comments.</span><span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.11" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p6.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.g4" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.12" class="ltx_p">This modified file contains the <span id="A1.p6.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.1.p2.12.1" class="ltx_text ltx_font_typewriter">GameBoard</span> class that represents the game board and handles the logic of the game.</span>
</span>
<span id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1" class="ltx_para ltx_noindent"><svg id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1" class="ltx_picture" height="3450.54" overflow="visible" version="1.1" width="354.33"><g transform="translate(0,3450.54) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#006666" fill-opacity="1.0"><path d="M 0 0.69 L 0 3449.85 C 0 3450.23 0.31 3450.54 0.69 3450.54 L 353.64 3450.54 C 354.02 3450.54 354.33 3450.23 354.33 3449.85 L 354.33 0.69 C 354.33 0.31 354.02 0 353.64 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 3428.98 L 353.64 3428.98 L 353.64 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 3433.61)"><foreignObject width="313.58" height="12.3" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:226.6pt;">
<span id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.2.2.2.1.1.1" class="ltx_p"><span id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.2.2.2.1.1.1.1" class="ltx_text ltx_font_bold">board.py</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="313.58" height="3404.67" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:226.6pt;">
<span id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2" class="ltx_listing ltx_lst_language_Python ltx_lstlisting ltx_listing"><span class="ltx_listing_data"><a href="data:text/plain;base64,Y2xhc3MgR2FtZUJvYXJkOgogICAgZGVmIGNoZWNrX3dpbm5lcihzZWxmKToKICAgICAgICBmb3Igcm93IGluIHJhbmdlKDE1KToKICAgICAgICAgICAgZm9yIGNvbCBpbiByYW5nZSgxMSk6CiAgICAgICAgICAgICAgICBpZiBjaGVja193aW5uZXIoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ib2FyZFtyb3ddW2NvbF0KICAgICAgICBmb3IgY29sIGluIHJhbmdlKDE1KToKICAgICAgICAgICAgZm9yIHJvdyBpbiByYW5nZSgxMSk6CiAgICAgICAgICAgICAgICBpZiBjaGVja193aW5uZXIoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ib2FyZFtyb3ddW2NvbF0KICAgICAgICByZXR1cm4gTm9uZQogICAgZGVmIGlzX2JvYXJkX2Z1bGwoc2VsZik6CiAgICAgICAgZm9yIHJvdyBpbiByYW5nZSgxNSk6CiAgICAgICAgICAgIGZvciBjb2wgaW4gcmFuZ2UoMTUpOgogICAgICAgICAgICAgICAgaWYgc2VsZi5ib2FyZFtyb3ddW2NvbF0gPT0gMDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQ==" download="">⬇</a></span>
<span id="lstnumberx49" class="ltx_listingline"><span id="lstnumberx49.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">class</span><span id="lstnumberx49.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx49.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GameBoard</span><span id="lstnumberx49.4" class="ltx_text ltx_font_typewriter">:</span>
</span>
<span id="lstnumberx50" class="ltx_listingline"><span id="lstnumberx50.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx50.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx50.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx50.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">check_winner</span><span id="lstnumberx50.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx50.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx50.7" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx51" class="ltx_listingline"><span id="lstnumberx51.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx51.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx51.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx51.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx51.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx51.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx51.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx51.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx51.9" class="ltx_text ltx_font_typewriter">(15):</span>
</span>
<span id="lstnumberx52" class="ltx_listingline"><span id="lstnumberx52.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx52.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx52.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx52.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx52.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx52.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx52.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx52.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx52.9" class="ltx_text ltx_font_typewriter">(11):</span>
</span>
<span id="lstnumberx53" class="ltx_listingline"><span id="lstnumberx53.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                </span><span id="lstnumberx53.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">if</span><span id="lstnumberx53.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx53.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">check_winner</span><span id="lstnumberx53.5" class="ltx_text ltx_font_typewriter">():</span>
</span>
<span id="lstnumberx54" class="ltx_listingline"><span id="lstnumberx54.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                    </span><span id="lstnumberx54.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">return</span><span id="lstnumberx54.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx54.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx54.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx54.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board</span><span id="lstnumberx54.7" class="ltx_text ltx_font_typewriter">[</span><span id="lstnumberx54.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx54.9" class="ltx_text ltx_font_typewriter">][</span><span id="lstnumberx54.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx54.11" class="ltx_text ltx_font_typewriter">]</span>
</span>
<span id="lstnumberx55" class="ltx_listingline"><span id="lstnumberx55.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx55.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx55.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx55.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx55.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx55.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx55.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx55.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx55.9" class="ltx_text ltx_font_typewriter">(15):</span>
</span>
<span id="lstnumberx56" class="ltx_listingline"><span id="lstnumberx56.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx56.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx56.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx56.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx56.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx56.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx56.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx56.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx56.9" class="ltx_text ltx_font_typewriter">(11):</span>
</span>
<span id="lstnumberx57" class="ltx_listingline"><span id="lstnumberx57.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                </span><span id="lstnumberx57.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">if</span><span id="lstnumberx57.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx57.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">check_winner</span><span id="lstnumberx57.5" class="ltx_text ltx_font_typewriter">():</span>
</span>
<span id="lstnumberx58" class="ltx_listingline"><span id="lstnumberx58.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                    </span><span id="lstnumberx58.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">return</span><span id="lstnumberx58.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx58.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx58.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx58.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board</span><span id="lstnumberx58.7" class="ltx_text ltx_font_typewriter">[</span><span id="lstnumberx58.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx58.9" class="ltx_text ltx_font_typewriter">][</span><span id="lstnumberx58.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx58.11" class="ltx_text ltx_font_typewriter">]</span>
</span>
<span id="lstnumberx59" class="ltx_listingline"><span id="lstnumberx59.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx59.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">return</span><span id="lstnumberx59.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx59.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">None</span>
</span>
<span id="lstnumberx60" class="ltx_listingline"><span id="lstnumberx60.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx60.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx60.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx60.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">is_board_full</span><span id="lstnumberx60.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx60.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx60.7" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx61" class="ltx_listingline"><span id="lstnumberx61.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx61.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx61.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx61.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx61.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx61.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx61.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx61.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx61.9" class="ltx_text ltx_font_typewriter">(15):</span>
</span>
<span id="lstnumberx62" class="ltx_listingline"><span id="lstnumberx62.1" class="ltx_text ltx_lst_space ltx_font_typewriter">            </span><span id="lstnumberx62.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx62.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx62.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx62.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx62.6" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx62.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx62.8" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx62.9" class="ltx_text ltx_font_typewriter">(15):</span>
</span>
<span id="lstnumberx63" class="ltx_listingline"><span id="lstnumberx63.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                </span><span id="lstnumberx63.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">if</span><span id="lstnumberx63.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx63.4" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx63.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx63.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board</span><span id="lstnumberx63.7" class="ltx_text ltx_font_typewriter">[</span><span id="lstnumberx63.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">row</span><span id="lstnumberx63.9" class="ltx_text ltx_font_typewriter">][</span><span id="lstnumberx63.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">col</span><span id="lstnumberx63.11" class="ltx_text ltx_font_typewriter">]</span><span id="lstnumberx63.12" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx63.13" class="ltx_text ltx_font_typewriter">==</span><span id="lstnumberx63.14" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx63.15" class="ltx_text ltx_font_typewriter">0:</span>
</span>
<span id="lstnumberx64" class="ltx_listingline"><span id="lstnumberx64.1" class="ltx_text ltx_lst_space ltx_font_typewriter">                    </span><span id="lstnumberx64.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">return</span><span id="lstnumberx64.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx64.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">False</span>
</span>
<span id="lstnumberx65" class="ltx_listingline"><span id="lstnumberx65.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx65.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">return</span><span id="lstnumberx65.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx65.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">True</span>
</span>
</span>
<span id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_p"><math id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1a"><mi mathvariant="normal" id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1" xref="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1b"><ci id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml" xref="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p6.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></foreignObject></g></g></svg>
</span></span></foreignObject></g></g></svg>
</div>
<div id="A1.p7" class="ltx_para ltx_noindent">
<svg id="A1.p7.pic1" class="ltx_picture" height="3588.13" overflow="visible" version="1.1" width="600"><g transform="translate(0,3588.13) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 3582.23 C 0 3585.49 2.64 3588.13 5.91 3588.13 L 594.09 3588.13 C 597.36 3588.13 600 3585.49 600 3582.23 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 3562.49 L 598.03 3562.49 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 3510.17 L 598.03 3510.17" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 3568.39)"><foreignObject width="556.69" height="13.84" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p7.pic1.15.15.15.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p7.pic1.15.15.15.1.1.1" class="ltx_p">Testing: Code Execution (via Thought Instruction)</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 3521.98)"><foreignObject width="556.69" height="28.69" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p7.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p7.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p7.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1" class="ltx_p">: Programmer  <img src="/html/2307.07924/assets/figures/tester.png" id="A1.p7.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">: Tester</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="3484.58" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000"><span id="A1.p7.pic1.14.14.14.14.14.14.14.14.14.14.14.12.12.12.12.12.12.3" class="ltx_inline-logical-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p7.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.1.p3" class="ltx_para"><span id="A1.p7.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.1.p3.1" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p7.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.1.p3.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/tester.png" id="A1.p7.pic1.3.3.3.3.3.3.3.3.3.3.3.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p7.pic1.12.12.12.12.12.12.12.12.12.12.12.10.10.10.10.10.10.1.p3.3" class="ltx_p">Here is the test report of the software:</span>
</span>
<span id="A1.p7.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1" class="ltx_para ltx_noindent"><svg id="A1.p7.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1" class="ltx_picture" height="1072.5" overflow="visible" version="1.1" width="326.77"><g transform="translate(0,1072.5) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#660000" fill-opacity="1.0"><path d="M 0 0.69 L 0 1071.81 C 0 1072.19 0.31 1072.5 0.69 1072.5 L 326.08 1072.5 C 326.46 1072.5 326.77 1072.19 326.77 1071.81 L 326.77 0.69 C 326.77 0.31 326.46 0 326.08 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 1053.79 L 326.08 1053.79 L 326.08 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 1058.42)"><foreignObject width="286.02" height="9.46" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p7.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:206.7pt;">
<span id="A1.p7.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1" class="ltx_p"><span id="A1.p7.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.1.1.1.1.1.1.1" class="ltx_text ltx_font_bold">Error</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="286.02" height="1029.47" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p7.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:206.7pt;">
<span id="A1.p7.pic1.4.4.4.4.4.4.4.4.4.4.4.2.2.2.2.2.2.p1.pic1.2.2.2.1.1.1" class="ltx_listing ltx_lst_language_Python ltx_lstlisting ltx_listing"><span class="ltx_listing_data"><a href="data:text/plain;base64,VHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIm1haW4ucHkiLCBsaW5lIDE5LCBpbiA8bW9kdWxlPgogICAgZ2FtZSA9IEdvbW9rdUdhbWUoKQpOYW1lRXJyb3I6IG5hbWUgJ0dvbW9rdUdhbWUnIGlzIG5vdCBkZWZpbmVk" download="">⬇</a></span>
<span id="lstnumberx66" class="ltx_listingline"><span id="lstnumberx66.1" class="ltx_text ltx_lst_identifier ltx_font_typewriter">Traceback</span><span id="lstnumberx66.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx66.3" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx66.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">most</span><span id="lstnumberx66.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx66.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">recent</span><span id="lstnumberx66.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx66.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">call</span><span id="lstnumberx66.9" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx66.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">last</span><span id="lstnumberx66.11" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx67" class="ltx_listingline"><span id="lstnumberx67.1" class="ltx_text ltx_lst_space ltx_font_typewriter">  </span><span id="lstnumberx67.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">File</span><span id="lstnumberx67.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx67.4" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"main.py"</span><span id="lstnumberx67.5" class="ltx_text ltx_font_typewriter">,</span><span id="lstnumberx67.6" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx67.7" class="ltx_text ltx_lst_identifier ltx_font_typewriter">line</span><span id="lstnumberx67.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx67.9" class="ltx_text ltx_font_typewriter">19,</span><span id="lstnumberx67.10" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx67.11" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx67.12" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx67.13" class="ltx_text ltx_font_typewriter">&lt;</span><span id="lstnumberx67.14" class="ltx_text ltx_lst_identifier ltx_font_typewriter">module</span><span id="lstnumberx67.15" class="ltx_text ltx_font_typewriter">&gt;</span>
</span>
<span id="lstnumberx68" class="ltx_listingline"><span id="lstnumberx68.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx68.2" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game</span><span id="lstnumberx68.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx68.4" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx68.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx68.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GomokuGame</span><span id="lstnumberx68.7" class="ltx_text ltx_font_typewriter">()</span>
</span>
<span id="lstnumberx69" class="ltx_listingline"><span id="lstnumberx69.1" class="ltx_text ltx_lst_identifier ltx_font_typewriter">NameError</span><span id="lstnumberx69.2" class="ltx_text ltx_font_typewriter">:</span><span id="lstnumberx69.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx69.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">name</span><span id="lstnumberx69.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx69.6" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">’GomokuGame’</span><span id="lstnumberx69.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx69.8" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">is</span><span id="lstnumberx69.9" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx69.10" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">not</span><span id="lstnumberx69.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx69.12" class="ltx_text ltx_lst_identifier ltx_font_typewriter">defined</span>
</span>
</span>
</span></foreignObject></g></g></svg>
</span>
<span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4" class="ltx_para"><span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.1" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p7.pic1.5.5.5.5.5.5.5.5.5.5.5.3.3.3.3.3.3.g2" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.2" class="ltx_p">According to the test reports, please locate and summarize the bugs that cause the problem.</span><span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.3" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/tester.png" id="A1.p7.pic1.6.6.6.6.6.6.6.6.6.6.6.4.4.4.4.4.4.g3" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.4" class="ltx_p">Based on the test report, the bug causing the problem is a NameError. The error message indicates that the name <span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.4.1" class="ltx_text ltx_font_typewriter">GomokuGame</span> is not defined. This suggests that there is a missing import or definition for the <span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.4.2" class="ltx_text ltx_font_typewriter">GomokuGame</span> class in the source code.
To resolve this issue, you need to import or define the
<span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.4.3" class="ltx_text ltx_font_typewriter">GomokuGame</span> class in the source code before it is used. This can be done by adding the necessary import statement or by defining the class within the same file or in a separate module that is imported.</span>
<span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.5" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;background:black;display:inline-block;"> </span></span><span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.6" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.7" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/tester.png" id="A1.p7.pic1.7.7.7.7.7.7.7.7.7.7.7.5.5.5.5.5.5.g4" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.8" class="ltx_p">To make the software execute smoothly and robustly, you should modify the problematic code segments based on the test report and my suggestions.</span><span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.9" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p7.pic1.8.8.8.8.8.8.8.8.8.8.8.6.6.6.6.6.6.g5" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.10" class="ltx_p">This modified file has imported the <span id="A1.p7.pic1.13.13.13.13.13.13.13.13.13.13.13.11.11.11.11.11.11.2.p4.10.1" class="ltx_text ltx_font_typewriter">GameBoard</span> class that represents the game board and handles the logic of the game.</span>
</span>
<span id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2" class="ltx_para ltx_noindent"><svg id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1" class="ltx_picture" height="2171.64" overflow="visible" version="1.1" width="409.45"><g transform="translate(0,2171.64) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#006666" fill-opacity="1.0"><path d="M 0 0.69 L 0 2170.94 C 0 2171.33 0.31 2171.64 0.69 2171.64 L 408.76 2171.64 C 409.14 2171.64 409.45 2171.33 409.45 2170.94 L 409.45 0.69 C 409.45 0.31 409.14 0 408.76 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 2150.45 L 408.76 2150.45 L 408.76 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 2155.07)"><foreignObject width="368.69" height="11.93" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:266.5pt;">
<span id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.2.2.2.1.1.1" class="ltx_p"><span id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.2.2.2.1.1.1.1" class="ltx_text ltx_font_bold">main.py</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="368.69" height="2126.13" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:266.5pt;">
<span id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2" class="ltx_listing ltx_lst_language_Python ltx_lstlisting ltx_listing"><span class="ltx_listing_data"><a href="data:text/plain;base64,aW1wb3J0IHRraW50ZXIgYXMgdGsKZnJvbSB0a2ludGVyIGltcG9ydCBtZXNzYWdlYm94IGFzIHRrbWVzc2FnZWJveApmcm9tIGJvYXJkIGltcG9ydCBHYW1lQm9hcmQKY2xhc3MgR2FtZUdVSToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnJvb3QgPSB0ay5UaygpCiAgICAgICAgc2VsZi5yb290LnRpdGxlKCJHb21va3UiKQogICAgICAgIHNlbGYuZ2FtZV9ib2FyZCA9IEdhbWVCb2FyZCgpCiAgICAgICAgc2VsZi5idXR0b25zID0gW1tOb25lXSAqIDE1IGZvciBfIGluIHJhbmdlKDE1KV0KICAgICAgICBzZWxmLmNyZWF0ZV93aWRnZXRzKCk=" download="">⬇</a></span>
<span id="lstnumberx70" class="ltx_listingline"><span id="lstnumberx70.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">import</span><span id="lstnumberx70.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx70.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">tkinter</span><span id="lstnumberx70.4" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx70.5" class="ltx_text ltx_lst_identifier ltx_font_typewriter">as</span><span id="lstnumberx70.6" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx70.7" class="ltx_text ltx_lst_identifier ltx_font_typewriter">tk</span>
</span>
<span id="lstnumberx71" class="ltx_listingline"><span id="lstnumberx71.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">from</span><span id="lstnumberx71.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx71.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">tkinter</span><span id="lstnumberx71.4" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx71.5" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">import</span><span id="lstnumberx71.6" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx71.7" class="ltx_text ltx_lst_identifier ltx_font_typewriter">messagebox</span><span id="lstnumberx71.8" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx71.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">as</span><span id="lstnumberx71.10" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx71.11" class="ltx_text ltx_lst_identifier ltx_font_typewriter">tkmessagebox</span>
</span>
<span id="lstnumberx72" class="ltx_listingline"><span id="lstnumberx72.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">from</span><span id="lstnumberx72.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx72.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">board</span><span id="lstnumberx72.4" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx72.5" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">import</span><span id="lstnumberx72.6" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx72.7" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GameBoard</span>
</span>
<span id="lstnumberx73" class="ltx_listingline"><span id="lstnumberx73.1" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">class</span><span id="lstnumberx73.2" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx73.3" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GameGUI</span><span id="lstnumberx73.4" class="ltx_text ltx_font_typewriter">:</span>
</span>
<span id="lstnumberx74" class="ltx_listingline"><span id="lstnumberx74.1" class="ltx_text ltx_lst_space ltx_font_typewriter">    </span><span id="lstnumberx74.2" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">def</span><span id="lstnumberx74.3" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx74.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">__init__</span><span id="lstnumberx74.5" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx74.6" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx74.7" class="ltx_text ltx_font_typewriter">):</span>
</span>
<span id="lstnumberx75" class="ltx_listingline"><span id="lstnumberx75.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx75.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx75.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx75.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">root</span><span id="lstnumberx75.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx75.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx75.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx75.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">tk</span><span id="lstnumberx75.9" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx75.10" class="ltx_text ltx_lst_identifier ltx_font_typewriter">Tk</span><span id="lstnumberx75.11" class="ltx_text ltx_font_typewriter">()</span>
</span>
<span id="lstnumberx76" class="ltx_listingline"><span id="lstnumberx76.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx76.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx76.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx76.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">root</span><span id="lstnumberx76.5" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx76.6" class="ltx_text ltx_lst_identifier ltx_font_typewriter">title</span><span id="lstnumberx76.7" class="ltx_text ltx_font_typewriter">(</span><span id="lstnumberx76.8" class="ltx_text ltx_lst_string ltx_font_typewriter ltx_font_bold">"Gomoku"</span><span id="lstnumberx76.9" class="ltx_text ltx_font_typewriter">)</span>
</span>
<span id="lstnumberx77" class="ltx_listingline"><span id="lstnumberx77.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx77.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx77.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx77.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">game_board</span><span id="lstnumberx77.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx77.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx77.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx77.8" class="ltx_text ltx_lst_identifier ltx_font_typewriter">GameBoard</span><span id="lstnumberx77.9" class="ltx_text ltx_font_typewriter">()</span>
</span>
<span id="lstnumberx78" class="ltx_listingline"><span id="lstnumberx78.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx78.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx78.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx78.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">buttons</span><span id="lstnumberx78.5" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.6" class="ltx_text ltx_font_typewriter">=</span><span id="lstnumberx78.7" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.8" class="ltx_text ltx_font_typewriter">[[</span><span id="lstnumberx78.9" class="ltx_text ltx_lst_identifier ltx_font_typewriter">None</span><span id="lstnumberx78.10" class="ltx_text ltx_font_typewriter">]</span><span id="lstnumberx78.11" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.12" class="ltx_text ltx_font_typewriter">*</span><span id="lstnumberx78.13" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.14" class="ltx_text ltx_font_typewriter">15</span><span id="lstnumberx78.15" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.16" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">for</span><span id="lstnumberx78.17" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.18" class="ltx_text ltx_lst_identifier ltx_font_typewriter">_</span><span id="lstnumberx78.19" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.20" class="ltx_text ltx_lst_keyword ltx_font_typewriter ltx_font_bold">in</span><span id="lstnumberx78.21" class="ltx_text ltx_lst_space ltx_font_typewriter"> </span><span id="lstnumberx78.22" class="ltx_text ltx_lst_keyword ltx_lst_keywords2 ltx_font_typewriter ltx_font_bold">range</span><span id="lstnumberx78.23" class="ltx_text ltx_font_typewriter">(15)]</span>
</span>
<span id="lstnumberx79" class="ltx_listingline"><span id="lstnumberx79.1" class="ltx_text ltx_lst_space ltx_font_typewriter">        </span><span id="lstnumberx79.2" class="ltx_text ltx_lst_emph ltx_font_typewriter ltx_font_bold">self</span><span id="lstnumberx79.3" class="ltx_text ltx_font_typewriter">.</span><span id="lstnumberx79.4" class="ltx_text ltx_lst_identifier ltx_font_typewriter">create_widgets</span><span id="lstnumberx79.5" class="ltx_text ltx_font_typewriter">()</span>
</span>
</span>
<span id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_p"><math id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1a"><mi mathvariant="normal" id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1" xref="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1b"><ci id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml" xref="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p7.pic1.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.p2.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></foreignObject></g></g></svg>
</span>
<span id="A1.p7.pic1.14.14.14.14.14.14.14.14.14.14.14.12.12.12.12.12.12.3.p5" class="ltx_para">
<span id="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1" class="ltx_p"><math id="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1a"><mi mathvariant="normal" id="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1.1" xref="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1b"><ci id="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1.1.cmml" xref="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p7.pic1.10.10.10.10.10.10.10.10.10.10.10.8.8.8.8.8.8.1.m1.1c">\cdots</annotation></semantics></math></span><span id="A1.p7.pic1.14.14.14.14.14.14.14.14.14.14.14.12.12.12.12.12.12.3.p5.1" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/tester.png" id="A1.p7.pic1.11.11.11.11.11.11.11.11.11.11.11.9.9.9.9.9.9.g6" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p7.pic1.14.14.14.14.14.14.14.14.14.14.14.12.12.12.12.12.12.3.p5.2" class="ltx_p">The code is well-structured and follows good coding practices. It passed the test successfully.</span>
</span></span></foreignObject></g></g></svg>
</div>
<div id="A1.p8" class="ltx_para ltx_noindent">
<svg id="A1.p8.pic1" class="ltx_picture" height="632.95" overflow="visible" version="1.1" width="600"><g transform="translate(0,632.95) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#404040" fill-opacity="1.0"><path d="M 0 5.91 L 0 627.04 C 0 630.3 2.64 632.95 5.91 632.95 L 594.09 632.95 C 597.36 632.95 600 630.3 600 627.04 L 600 5.91 C 600 2.64 597.36 0 594.09 0 L 5.91 0 C 2.64 0 0 2.64 0 5.91 Z" style="stroke:none"></path></g><g fill="#F2F2F2" fill-opacity="1.0"><path d="M 1.97 5.91 L 1.97 608.99 L 598.03 608.99 L 598.03 5.91 C 598.03 3.73 596.27 1.97 594.09 1.97 L 5.91 1.97 C 3.73 1.97 1.97 3.73 1.97 5.91 Z" style="stroke:none"></path></g><g stroke-dasharray="2.84528pt,2.84528pt" stroke-dashoffset="1.42264pt" fill="#404040" stroke="#404040" stroke-opacity="1.0" color="#404040"><path d="M 1.97 556.68 L 598.03 556.68" style="fill:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 614.9)"><foreignObject width="556.69" height="12.15" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#FFFFFF">
<span id="A1.p8.pic1.13.13.13.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p8.pic1.13.13.13.1.1.1" class="ltx_p">Documenting</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 568.49)"><foreignObject width="556.69" height="28.69" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000">
<span id="A1.p8.pic1.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:402.3pt;"><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p8.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p8.pic1.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3" class="ltx_p">: CTO  <img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p8.pic1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">: Programmer  <img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p8.pic1.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.g2" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">: CEO  <img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p8.pic1.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.g3" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]">: CPO</span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 21.65 13.78)"><foreignObject width="556.69" height="531.09" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible" color="#000000"><span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2" class="ltx_inline-logical-block ltx_minipage ltx_align_bottom" style="width:402.3pt;">
<span id="A1.p8.pic1.11.11.11.11.11.11.11.11.11.11.11.7.7.7.7.7.7.1.p2" class="ltx_para"><span id="A1.p8.pic1.11.11.11.11.11.11.11.11.11.11.11.7.7.7.7.7.7.1.p2.1" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p8.pic1.11.11.11.11.11.11.11.11.11.11.11.7.7.7.7.7.7.1.p2.2" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cto.png" id="A1.p8.pic1.5.5.5.5.5.5.5.5.5.5.5.1.1.1.1.1.1.g1" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p8.pic1.11.11.11.11.11.11.11.11.11.11.11.7.7.7.7.7.7.1.p2.3" class="ltx_p">To specify the dependencies or packages required for the project to run properly, write a <span id="A1.p8.pic1.11.11.11.11.11.11.11.11.11.11.11.7.7.7.7.7.7.1.p2.3.1" class="ltx_text ltx_font_typewriter">requirements.txt</span> file according to the codes to specify the dependencies or packages required for the project to run properly.</span><span id="A1.p8.pic1.11.11.11.11.11.11.11.11.11.11.11.7.7.7.7.7.7.1.p2.4" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/programmer.png" id="A1.p8.pic1.6.6.6.6.6.6.6.6.6.6.6.2.2.2.2.2.2.g2" class="ltx_graphics ltx_img_portrait" width="17" height="26" alt="[Uncaptioned image]">
<span id="A1.p8.pic1.11.11.11.11.11.11.11.11.11.11.11.7.7.7.7.7.7.1.p2.5" class="ltx_p">Here is the environment dependence file:</span>
</span>
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1" class="ltx_para ltx_noindent"><svg id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1" class="ltx_picture" height="157.58" overflow="visible" version="1.1" width="157.48"><g transform="translate(0,157.58) matrix(1 0 0 -1 0 0)" fill="#000000" stroke="#000000" stroke-width="0.4pt"><g fill="#006600" fill-opacity="1.0"><path d="M 0 0.69 L 0 156.89 C 0 157.27 0.31 157.58 0.69 157.58 L 156.79 157.58 C 157.17 157.58 157.48 157.27 157.48 156.89 L 157.48 0.69 C 157.48 0.31 157.17 0 156.79 0 L 0.69 0 C 0.31 0 0 0.31 0 0.69 Z" style="stroke:none"></path></g><g fill="#FFFFFF" fill-opacity="1.0"><path d="M 0.69 0.69 L 0.69 136.39 L 156.79 136.39 L 156.79 0.69 Z" style="stroke:none"></path></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 141.02)"><foreignObject width="116.73" height="11.93" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.2.2.2.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:84.4pt;">
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.2.2.2.1.1.1" class="ltx_p"><span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.2.2.2.1.1.1.1" class="ltx_text ltx_font_bold">requirements.txt</span></span>
</span></foreignObject></g><g fill-opacity="1.0" transform="matrix(1.0 0.0 0.0 1.0 20.38 12.5)"><foreignObject width="116.73" height="112.08" transform="matrix(1 0 0 -1 0 16.6)" overflow="visible">
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_inline-block ltx_minipage ltx_align_bottom" style="width:84.4pt;">
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2" class="ltx_p">numpy==1.24.3</span>
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3" class="ltx_p">pandas&gt;=1.1.4</span>
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4" class="ltx_p">pygame==2.5.0</span>
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5" class="ltx_p">requests==2.31.0</span>
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.6" class="ltx_p">tkinter==8.6</span>
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7" class="ltx_p">tqdm==4.65.0</span>
<span id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1" class="ltx_p"><math id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1" class="ltx_Math" alttext="\cdots" display="inline"><semantics id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1a"><mi mathvariant="normal" id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1" xref="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml">⋯</mi><annotation-xml encoding="MathML-Content" id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1b"><ci id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1.cmml" xref="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1.1">⋯</ci></annotation-xml><annotation encoding="application/x-tex" id="A1.p8.pic1.7.7.7.7.7.7.7.7.7.7.7.3.3.3.3.3.3.p1.pic1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.m1.1c">\cdots</annotation></semantics></math></span>
</span></foreignObject></g></g></svg>
</span>
<span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3" class="ltx_para">
<span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3.1" class="ltx_p"><span class="ltx_rule" style="width:433.6pt;height:0.6pt;background:black;display:inline-block;"> </span></span><span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3.2" class="ltx_ERROR undefined">{dialogue}</span><span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3.3" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/ceo.png" id="A1.p8.pic1.8.8.8.8.8.8.8.8.8.8.8.4.4.4.4.4.4.g3" class="ltx_graphics ltx_img_portrait" width="17" height="23" alt="[Uncaptioned image]">
<span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3.4" class="ltx_p">According to the user demands, codes, requirements, and file format listed above, write a <span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3.4.1" class="ltx_text ltx_font_typewriter">manual.md</span> file to provide detailed introduction to the uses of the software.</span><span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3.5" class="ltx_ERROR undefined">\speak</span><img src="/html/2307.07924/assets/figures/cpo.png" id="A1.p8.pic1.9.9.9.9.9.9.9.9.9.9.9.5.5.5.5.5.5.g4" class="ltx_graphics ltx_img_square" width="17" height="21" alt="[Uncaptioned image]">
<span id="A1.p8.pic1.12.12.12.12.12.12.12.12.12.12.12.8.8.8.8.8.8.2.p3.6" class="ltx_p">Here is the user manual:</span><img src="/html/2307.07924/assets/figures/manual.png" id="A1.p8.pic1.10.10.10.10.10.10.10.10.10.10.10.6.6.6.6.6.6.g5" class="ltx_graphics ltx_img_portrait" width="173" height="254" alt="[Uncaptioned image]">
</span></span></foreignObject></g></g></svg>
</div>
<figure id="A1.F11" class="ltx_figure"><img src="/html/2307.07924/assets/figures/ChatDevDataCategory.png" id="A1.F11.g1" class="ltx_graphics ltx_centering ltx_img_portrait" width="359" height="845" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 11: </span>The category of NLDD.</figcaption>
</figure>
<figure id="A1.F12" class="ltx_figure"><img src="/html/2307.07924/assets/figures/ChatDevDataLength.png" id="A1.F12.g1" class="ltx_graphics ltx_centering ltx_img_landscape" width="419" height="235" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 12: </span>The distribution of description length in NLDD.It can be seen from the figure that the length presents an approximate mixed Gaussian distribution, mainly concentrated around the lengths of 17 and 77, which represents the long and short software descriptions in the NLDD.</figcaption>
</figure>
<figure id="A1.F13" class="ltx_figure"><img src="/html/2307.07924/assets/x1.png" id="A1.F13.g1" class="ltx_graphics ltx_centering ltx_img_square" width="323" height="323" alt="Refer to caption">
<figcaption class="ltx_caption ltx_centering"><span class="ltx_tag ltx_tag_figure">Figure 13: </span>We transform the software description into embeddings with the OpenAI Ada model and then perform dimensionality reduction and visualization. As shown in the figure, it can be observed that 1) software descriptions of the same category are distributed in clusters, indicating that the generated descriptions are highly related to their categories. 2) Descriptions in different subcategories under the same category are clustered together, such as the eight game subcategories in the lower right corner. 3) Some subcategories of different categories also show overlaps in the figure, such as Tools &amp; Utilities and Graphics, Schedule and Business, Sports and Sports Game. Such an overlap is comprehensible given the multi-functionality of some software applications that may not be confined to a single classification.</figcaption>
</figure>
<div class="ltx_pagination ltx_role_newpage"></div>
</section>
</article>
</div>
<div class="ar5iv-footer"><a href="/html/2307.07923" class="ar5iv-nav-button ar5iv-nav-button-prev">◄</a>
    <a class="ar5iv-home-button" href="/"><img height="40" alt="ar5iv homepage" src="/assets/ar5iv.png"></a>
    <a href="/feeling_lucky" class="ar5iv-text-button">Feeling<br>lucky?</a>
    <a href="/log/2307.07924" class="ar5iv-text-button ar5iv-severity-error">Conversion<br>report</a>
    <a class="ar5iv-text-button" target="_blank" href="https://github.com/dginev/ar5iv/issues/new?template=improve-article--arxiv-id-.md&title=Improve+article+2307.07924">Report<br>an issue</a>
    <a href="https://arxiv.org/abs/2307.07924" class="ar5iv-text-button arxiv-ui-theme">View&nbsp;original<br>on&nbsp;arXiv</a><a href="/html/2307.07925" class="ar5iv-nav-button ar5iv-nav-button-next">►</a>
</div><footer class="ltx_page_footer">
<a class="ar5iv-toggle-color-scheme" href="javascript:toggleColorScheme()" title="Toggle ar5iv color scheme"><span class="color-scheme-icon"></span></a>
<a class="ar5iv-footer-button" href="https://arxiv.org/help/license" target="_blank">Copyright</a>
<a class="ar5iv-footer-button" href="https://arxiv.org/help/policies/privacy_policy" target="_blank">Privacy Policy</a>

<div class="ltx_page_logo">Generated  on Wed Feb 28 17:51:38 2024 by <a target="_blank" href="http://dlmf.nist.gov/LaTeXML/" class="ltx_LaTeXML_logo"><span style="letter-spacing:-0.2em; margin-right:0.1em;">L<span class="ltx_font_smallcaps" style="position:relative; bottom:2.2pt;">a</span>T<span class="ltx_font_smallcaps" style="font-size:120%;position:relative; bottom:-0.2ex;">e</span></span><span style="font-size:90%; position:relative; bottom:-0.2ex;">XML</span><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wKExQZLWTEaOUAAAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAdpJREFUKM9tkL+L2nAARz9fPZNCKFapUn8kyI0e4iRHSR1Kb8ng0lJw6FYHFwv2LwhOpcWxTjeUunYqOmqd6hEoRDhtDWdA8ApRYsSUCDHNt5ul13vz4w0vWCgUnnEc975arX6ORqN3VqtVZbfbTQC4uEHANM3jSqXymFI6yWazP2KxWAXAL9zCUa1Wy2tXVxheKA9YNoR8Pt+aTqe4FVVVvz05O6MBhqUIBGk8Hn8HAOVy+T+XLJfLS4ZhTiRJgqIoVBRFIoric47jPnmeB1mW/9rr9ZpSSn3Lsmir1fJZlqWlUonKsvwWwD8ymc/nXwVBeLjf7xEKhdBut9Hr9WgmkyGEkJwsy5eHG5vN5g0AKIoCAEgkEkin0wQAfN9/cXPdheu6P33fBwB4ngcAcByHJpPJl+fn54mD3Gg0NrquXxeLRQAAwzAYj8cwTZPwPH9/sVg8PXweDAauqqr2cDjEer1GJBLBZDJBs9mE4zjwfZ85lAGg2+06hmGgXq+j3+/DsixYlgVN03a9Xu8jgCNCyIegIAgx13Vfd7vdu+FweG8YRkjXdWy329+dTgeSJD3ieZ7RNO0VAXAPwDEAO5VKndi2fWrb9jWl9Esul6PZbDY9Go1OZ7PZ9z/lyuD3OozU2wAAAABJRU5ErkJggg==" alt="Mascot Sammy"></a>
</div></footer>
</div>

    <script>
      var canMathML = typeof(MathMLElement) == "function";
      if (!canMathML) {
        var body = document.querySelector("body");
        body.firstElementChild.setAttribute('style', 'opacity: 0;');
        var loading = document.createElement("div");
        loading.setAttribute("id", "mathjax-loading-spinner");
        var message = document.createElement("div");
        message.setAttribute("id", "mathjax-loading-message");
        message.innerText = "Typesetting Equations...";
        body.prepend(loading);
        body.prepend(message);

        var el = document.createElement("script");
        el.src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js";
        document.querySelector("head").appendChild(el);

        window.MathJax = {
          startup: {
            pageReady: () => {
              return MathJax.startup.defaultPageReady().then(() => {
                body.removeChild(loading);
                body.removeChild(message);
                body.firstElementChild.removeAttribute('style');
              }); } } };
      }
    </script>
    <script>
    // Auxiliary function, building the preview feature when
    // an inline citation is clicked
    function clicked_cite(e) {
      e.preventDefault();
      let cite = this.closest('.ltx_cite');
      let next = cite.nextSibling;
      if (next && next.nodeType == Node.ELEMENT_NODE && next.getAttribute('class') == "ar5iv-bibitem-preview") {
        next.remove();
        return; }
      // Before adding a preview modal,
      // cleanup older previews, in case they're still open
      document.querySelectorAll('span.ar5iv-bibitem-preview').forEach(function(node) {
        node.remove();
      })

      // Create the preview
      preview = document.createElement('span');
      preview.setAttribute('class','ar5iv-bibitem-preview');
      let target = document.getElementById(this.getAttribute('href').slice(1));
      target.childNodes.forEach(function (child) {
        preview.append(child.cloneNode(true));
      });
      let close_x = document.createElement('button');
      close_x.setAttribute("aria-label","Close modal for bibliography item preview");
      close_x.textContent = "×";
      close_x.setAttribute('class', 'ar5iv-button-close-preview');
      close_x.setAttribute('onclick','this.parentNode.remove()');
      preview.append(close_x);
      preview.querySelectorAll('.ltx_tag_bibitem').forEach(function(node) {
        node.remove();
      });
      cite.parentNode.insertBefore(preview, cite.nextSibling);
      return;
    }
    // Global Document initialization:
    // - assign the preview feature to all inline citation links
    document.querySelectorAll(".ltx_cite .ltx_ref").forEach(function (link) {
      link.addEventListener("click", clicked_cite);
    });
    </script>
    </body>
</html>

2307.07924
Software engineering is a domain characterized by intricate decision-making processes, often relying on nuanced intuition and consultation. Recent advancements in deep learning have started to revolutionize software engineering practices through elaborate designs implemented at various stages of software development. In this paper, we present an innovative paradigm that leverages large language models (LLMs)  throughout the entire software development process, streamlining and unifying key processes through natural language communication, thereby eliminating the need for specialized models at each phase.
At the core of this paradigm lies ChatDev, a virtual chat-powered software development company that mirrors the established waterfall model, meticulously dividing the development process into four distinct chronological stages: designing, coding, testing, and documenting. Each stage engages a team of "software agents", such as programmers, code reviewers, and test engineers, fostering collaborative dialogue and facilitating a seamless workflow. The chat chain acts as a facilitator, breaking down each stage into atomic subtasks. This enables dual roles, allowing for proposing and validating solutions through context-aware communication, leading to efficient resolution of specific subtasks.
The instrumental analysis of ChatDev highlights its remarkable efficacy in software generation, enabling the completion of the entire software development process in under seven minutes at a cost of less than one dollar. It not only identifies and alleviates potential vulnerabilities but also rectifies potential hallucinations while maintaining commendable efficiency and cost-effectiveness. The potential of ChatDev unveils fresh possibilities for integrating LLMs into the realm of software development. Our code is available athttps://github.com/OpenBMB/ChatDev.
abstract
Communicative Agents for Software Development
Abstract
2307.07924
1Introduction“Collaboration allows us to know more than we are capable of knowing by ourselves. It empowers us to think differently, access information we wouldn’thave otherwise, and combine ideas as we work together towards a shared goal.”—–Paul SolarzSoftware engineering entails a methodical and disciplined approach to the development, operation, and maintenance of software systems. However, the complexity of software intelligence often leads to decisions based on intuition and limited consultation with senior developers.
Recent advancements in deep learning techniques have prompted researchers to explore their application in software engineering, aiming to improve effectiveness, efficiency, and cost reduction .
Prior studies in deep learning-based software engineering have addressed various tasks, categorized as software requirements, design, implementation, testing, and maintenance.
The software development process involves multiple roles, including organizational coordination, task allocation, code writing, system testing, and documentation preparation. It is a highly complex and intricate activity that demands meticulous attention to detail due to its long development cycles.In recent years,largelanguagemodels (LLMs)  have achieved significant milestones in the field ofnaturallanguageprocessing (NLP) and computer vision (CV) . After training on massive corpora using the “next word prediction” paradigm, LLMs have demonstrated impressive performance on a wide range of downstream tasks, such as context-aware question answering, machine translation, and code generation.
In fact, the core elements involved in software development, namely codes and documents, can both be regarded as “language” (i.e.,sequences of characters) . From this perspective, this paper explores an end-to-end software development framework driven by LLMs, encompassing requirements analysis, code development, system testing, and document generation, aiming to provide a unified, efficient, and cost-effective paradigm for software development.Directly generating an entire software system using LLMs can result in code hallucinations to a certain extent, similar to the phenomenon of hallucination in natural language knowledge querying. These hallucinations include incomplete implementation of functions, missing dependencies, and potential undiscovered bugs. Code hallucinations arise primarily due to two reasons. Firstly, the lack of task specificity confuses LLMs when generating a software system in one step. Granular tasks in software development, such as analyzing user/client requirements and selecting programming languages, provide guided thinking that is absent in the high-level nature of the task handled by LLMs. Secondly, the absence of cross-examination in decision-making poses significant risks.
Individual model instances propose a diverse range of answers, throwing the requirements to debate or examine the responses from other model instances to converge on a single and more accurate common answer, such as code peer-review and suggestion feedbacks.To address the aforementioned challenges, we “establish” a virtualchat-powered softwaretechnology company – ChatDev. It follows the classic waterfall modeland divides the process into four phases: designing, coding, testing, and documenting. At each phase, ChatDev recruits multiple "software agents" with different roles, such as programmers, reviewers, and testers. To facilitate effective communication and collaboration, ChatDev utilizes a proposed chat chain that divides each phase into atomic subtasks. Within the chat chain, each node represents a specific subtask, and two roles engage in context-aware, multi-turn discussions to propose and validate solutions. This approach ensures that client requirements are analyzed, creative ideas are generated, prototype systems are designed and implemented, potential issues are identified and addressed, debug information is explained, appealing graphics are created, and user manuals are generated. By guiding the software development process along the chat chain, ChatDev delivers the final software to the user, including source code, dependency environment specifications, and user manuals.The experiment analyzed all the software produced by ChatDev in response to 70 user requirements. On average, ChatDev generated 17.04 files per software, alleviated potential code vulnerabilities caused by code hallucinations 13.23 times, had a software production time of 409.84 seconds, and incurred a manufacturing cost of $0.2967. Discussions between a reviewer and a programmer led to the identification and modification of nearly twenty types of code vulnerabilities, while discussions between a tester and a programmer resulted in the identification and resolution of more than ten types of potential bugs.
In summary, our main contributions are as follows:We propose ChatDev, a chat-based software development framework. By merely specifying a task, ChatDev sequentially handles designing, coding, testing, and documenting. This new paradigm simplifies software development by unifying main processes through language communication, eliminating the need for specialized models at each phase.We propose thechat chainto decompose the development process into sequential atomic subtasks. Each subtask requires collaborative interaction and cross-examination between two roles. This framework enables multi-agent collaboration, user inspection of intermediate outputs, error diagnoses, and reasoning intervention. It ensures a granular focus on specific subtasks within each chat, facilitating effective collaboration and promoting the achievement of desired outputs.To further alleviate potential challenges related to code hallucinations, we introduce the thought instruction mechanism in each independent chat process during code completion, reviewing, and testing. By performing a “role flip”, an instructor explicitly injects specific thoughts for code modifications into instructions, thereby guiding the assistant programmer more precisely.The experiments demonstrate the efficiency and cost-effectiveness of ChatDev’s automated software development process. Through effective communication, proposal, and mutual examination between roles in each chat, the framework enables effective decision-making.
introduction
Communicative Agents for Software Development
1Introduction
2307.07924
2ChatDevSimilar to hallucinations encountered when using LLMs for natural language querying, directly generating entire software systems using LLMs can result in severe code hallucinations, such as incomplete implementation, missing dependencies, and undiscovered bugs.
These hallucinations may stem from the lack of specificity in the task and the absence of cross-examination in decision-making.
To address these limitations, as Figure1shows, we establish a virtualchat-powered softwaretechnology company – ChatDev, which comprises of recruited agents from diverse social identities, such as chief officers, professional programmers, test engineers, and art designers.
When presented with a task, the diverse agents at ChatDev collaborate to develop a required software, including an executable system, environmental guidelines, and user manuals.
This paradigm revolves around leveraging large language models as the core thinking component, enabling the agents to simulate the entire software development process, circumventing the need for additional model training and mitigating undesirable code hallucinations to some extent.2.1Chat ChainChatDev employs the widely adopted waterfall model, a prominent software development life cycle model, to divide the software development process into four distinct phases:designing,coding,testing, anddocumenting.
In the designing phase, innovative ideas are generated through collaborative brainstorming, and technical design requirements are defined. The coding phase involves the development and review of source code, while the testing phase integrates all components into a system and utilizes feedback messages from interpreter for debugging. The documenting phase encompasses the generation of environment specifications and user manuals.
Each of these phases necessitates effective communication among multiple roles, posing challenges in determining the sequence of interactions and identifying the relevant individuals to engage with.To address this, we propose a generalized architecture by breaking down each phase into multiple atomic chats, each with a specific focus on task-oriented role-playing involving two distinct roles.
Through the exchange of instructions and collaboration between the participating agents, the desired output for each chat, which forms a vital component of the target software, is achieved. An illustration of this process is depicted in Figure2, where a sequence of intermediate task-solving chats, referred to as a “chat chain”, is presented. In each chat, an instructor initiates instructions, guiding the dialogue towards task completion, while the assistant follows the instructions, provides suitable solutions, and engages in discussions regarding feasibility. The instructor and assistant cooperate through multi-turn dialogues until they reach a consensus and determine that the task has been successfully accomplished.The chat chain provides a transparent view of the software development process, shedding light on the decision-making path and offering opportunities for debugging when errors arise, which enables users to inspect intermediate outputs, diagnose errors, and intervene in the reasoning process if necessary.
Besides, chat chain ensures a granular focus on specific subtasks within each phase, facilitating effective collaboration and promoting the attainment of desired outputs.Figure 2:The proposed architecture of ChatDev consists of phase-level and chat-level components. At the phase level, the waterfall model is used to break down the software development process into four sequential phases. At the chat level, each phase is further divided into atomic chats. These atomic chats involve task-oriented role-playing between two agents, promoting collaborative communication. The communication follows an instruction-following style, where agents interact to accomplish a specific subtask within each chat.2.2DesigningIn the designing phase, ChatDev receives an initial idea from a human client.
This phase involves three predefined roles: CEO (chief executive officer) , CPO (chief product officer) , and CTO (chief technology officer) . The chat chain then breaks down the designing phase into sequential atomic chatting tasks, including decisions regarding the target software’s modality (CEO and CPO)  and the programming language (CEO and CTO) .Role AssignmentSystem prompts/messages are used to assign roles to each agent during the role-playing process.
In contrast to other conversational language models, our approach to prompt engineering is restricted solely to the initiation of role-playing scenarios.
The instructor is denoted as, while the assistant’s system prompt/message is denoted as. These prompts assign roles to the agents before the dialogues begin.
Letandrepresent two large language models.
Using the system message, we haveand, which serve as the instructor and assistant agents (Figure3(a) ) , respectively.
In our framework, the instructor initially acts as a CEO, engaging in interactive planning, while the assistant assumes the role of CPO, executing tasks and providing responses.
To achieve role specialization, we employinception prompting, which has proven effective in enabling agents to fulfill their roles.
The instructor and assistant prompts encompass vital details concerning the designated task and roles, communication protocols, termination criteria, and constraints aimed at preventing undesirable behaviors (e.g.,instruction redundancy, uninformative responses, infinite loops, etc.) .Memory StreamThe memory streamis a mechanism that maintains a comprehensive record of an agent’s previous dialogues, assisting in subsequent decision-making in an utterance-aware manner.
Formally, the instructor’s message at timeis denoted as, the assistant’s message as, and the related decisions as.
Equation1encapsulates the collection of conversational messages up to time.(1) whererepresents a LLM-based decision extractor which can be implemented via communication protocol detection or self-reflection (detailed below) .
In the succeeding time step, the instructor leverages the historical dialogue message setto impart a fresh instruction,, which is then conveyed to the assistant along with, as illustrated in Figure3(b) .
The assistant responds with a solution or message, denoted asin Equation2:(2) Following the acquisition of the solutionin response to the instruction, the message stream undergoes an update process utilizing Equation3:(3) We establish communication protocols through prompts. For example, an ending message satisfying specific formatting requirements (e.g., “MODALITY: Desktop Application”)  is generated when both parties reach a consensus. The system monitors communication to ensure compliance with the designated format, allowing for the conclusion of the current dialogue.(a) Role Specialization(b) Memory Stream(c) Self-ReflectionFigure 3:Three key mechanisms utilized in each chat. Role specialization ensures that each agent fulfills their designated functions and contributes effectively to the task-oriented dialogue. The memory stream maintains a comprehensive record of previous dialogues within the chat, enabling agents to make informed decisions. Self-reflection prompts the assistant to reflect on proposed decisions when both parties reach a consensus without triggering predefined termination conditions.Self-ReflectionOccasionally, we have observed dialogues where both parties reach a consensus but do not trigger the predefined communication protocols as termination conditions. In such cases, we introduce aself-reflectionmechanism, which involves extracting and retrieving memories. To implement this mechanism, we enlist a “pseudo self” as a new questioner and initiate a fresh chat. The pseudo questioner informs the current assistant of all the historical records from previous dialogues and requests a summary of the conclusive information from the dialogue, as shown in Figure3(c) . This mechanism effectively encourages the assistant to reflect upon the decisions proposed and discussed during the dialogue.2.3CodingThe coding phase involves three predefined roles: CTO, programmer, and art designer. The chat chain decomposes the coding phase into sequential atomic chatting tasks, such as generating complete codes (CTO and programmer)  and devising a graphical user interface (designer and programmer) .
Based on the main designs discussed in the previous phase, the CTO instructs the programmer to implement a software system using markdown format. The programmer generates codes in response and extracts the corresponding codes based on markdown format. The designer proposes a user-friendly graphical user interface (GUI)  that uses graphical icons for user interaction instead of text-based commands. Then, the designer creates visually appealing graphics using external text-to-image tools, which the programmer incorporates into the GUI design using standard toolkits.Code ManagementTo handle complex software systems, ChatDev utilizes object-oriented programming languages like Python. The modularity of object-oriented programming allows for self-contained objects, aiding troubleshooting and collaborative development. Reusability enables code reuse through inheritance, reducing redundancy. We introduce the “version evolution” mechanism to restrict visibility to the latest code version between roles, discarding earlier code versions from the memory stream. The programmer manages the project using Git-related commands. Proposed code modifications and changes increment the software version by 1.0. Version evolution gradually eliminates code hallucinations. The combination of object-oriented programming and version evolution is suitable for dialogues involving long code segments.(a) Naive Instruction in Coding(b) Thought Instruction in Coding(c) Naive Instruction in Testing(d) Thought Instruction in TestingFigure 4:The thought instruction mitigates code hallucinations during the coding and testing phases. Instead of providing generic instructions, thought instruction involves role swapping to inquire about unimplemented methods or explain feedback messages caused by bugs. This step allows for a clearer understanding of the existing code and identifies the specific gaps that need to be addressed. By gaining this awareness, the roles can then switch back, and the instructor can provide more specific instructions to guide the programmer accurately.Thought InstructionTraditional question answering can lead to inaccuracies or irrelevant information, especially in code generation, where naive instructions may result in unexpected hallucinations.
This issue becomes particularly problematic when generating code. For instance, when instructing the programmer to implement all unimplemented methods, a naive instruction may result in hallucinations, such as including methods that are reserved as unimplemented interfaces.
To address this, we propose the “thought instruction” mechanism, inspired by chain-of-thought prompting. It involves explicitly addressing specific problem-solving thoughts in instructions, akin to solving subtasks in a sequential manner.
As shown in Figure4(a) and4(b) , thought instruction includes swapping roles to inquire about which methods are not yet implemented and then switching back to provide the programmer with more precise instructions to follow.
By incorporating thought instruction, the coding process becomes more focused and targeted. The explicit expression of specific thoughts in the instructions helps to reduce ambiguity and ensures that the generated code aligns with the intended objectives. This mechanism enables a more accurate and context-aware approach to code completion, minimizing the occurrence of hallucination and resulting in more reliable and comprehensive code outputs.2.4TestingEven for human programmers, there is no guarantee that the code they write on the first attempt is always error-free.
Rather than discarding incorrect code outright, humans typically analyze and investigate code execution results to identify and rectify implementation errors.
In ChatDev, the testing phase involves three roles: programmer, reviewer, and tester. The process consists of sequential atomic chatting tasks, including peer review (programmer and reviewer)  and system testing (programmer and tester) . Peer review, or static debugging, examines source code to identify potential issues. System testing, a form of dynamic debugging, verifies software execution through tests conducted by the programmer using an interpreter. This testing focuses on evaluating application performance through black-box testing.In our practice, we observed that allowing two agents to communicate solely based on feedback messages from an interpreter does not result in a bug-free system. The programmer’s modifications may not strictly follow the feedback, leading to hallucinations. To address this, we further employ the thought instruction mechanism to explicitly express debugging thoughts in the instructions (Figure4(c) and4(d) ) . The tester executes the software, analyzes bugs, proposes modifications, and instructs the programmer accordingly. This iterative process continues until potential bugs are eliminated and the system runs successfully.In cases where an interpreter struggles with identifying fine-grained logical issues, the involvement of a human client in software testing becomes optional. ChatDev enables the human client to provide feedback and suggestions in natural language, similar to a reviewer or tester, using black-box testing or other strategies. ChatDev, based on human input, can understand and utilize this feedback to refine the software system.2.5DocumentingAfter the designing, coding, and testing phases, ChatDev employs four agents (CEO, CPO, CTO, and programmer)  to generate software project documentation. Using large language models, we leverage few-shot promptingwith in-context examples for document generation. The CTO instructs the programmer to provide configuration instructions for environmental dependencies, resulting in a document likerequirements.txt. This document allows users to configure the environment independently. Simultaneously, the CEO communicates requirements and system design to the CPO, who generates a user manual.Figure 5:The documenting phase involves generating relevant documents, such as external dependency specifications and user instructions. The user manual provides comprehensive information about the software’s technical architecture, installation instructions, and features, serving as a valuable resource for users. Once the dependencies are installed, a human client can execute the software using a suitable interpreter.
body
Communicative Agents for Software Development
2ChatDev
2307.07924
3ExperimentsOur experimental setup employs the “ChatGPT-turbo-16k” version of ChatGPT to simulate multi-agent software development. The language model temperature is set to 0.2 for controlled generation. In the coding phase, we allow a maximum of 5 attempts for code completion. The reviewer is permitted 5 chats to propose modifications, and a maximum of 5 software system tests are conducted in the testing phase.
For Python-based systems, we use Python 3.8.16 as the interpreter for testing.
Camelhas curated an instruction-following dialogue dataset, which spans across 20 programming languages, 50 domains, and 50 tasks per domain.
From this extensive task set, we randomly selected 70 tasks111For exmaple, “Implement a Gomoku game using Python, incorporating an AI opponent with varying difficulty levels” or “Create a Python program to develop an interactive weather dashboard”., including both specific and relatively abstract cases, to serve as the basis for analysis in our ChatDev software development.Software StatisticsWe performed a statistical analysis on the software systems generated by ChatDev. Key metrics, including the total dialogue turns, consumed tokens, software files, image assets, and version updates, were examined. Table1presents these metrics, providing valuable insights into the communication-based software development process. It offers a comprehensive overview of ChatDev’s development, covering aspects such as versioning, file composition, code complexity, and development iterations.Table 1:The statistical analysis of ChatDev’s software development, including minimum (Min) , maximum (Max) , and average (Avg.)  values for various aspects.MinMaxAvg.# Code Files2.008.004.26# Asset Files0.0021.008.74# Document Files4.005.004.04# Lines of Source Codes39.00359.00131.61# Lines of Dependencies1.005.002.90# Lines of User Manual31.00232.0053.96# Version Updates5.0042.0013.23# Software Re-development1.005.001.40The generated software typically includes 2 to 8 code files, with an average of 4.26 files.
Asset files, created by the art designer using external tools, range from 0 to 21, with an average of 8.74 files.
Here are some examples of concise text descriptions through which programmers request the designer to create images, such as “The text entry field where the user can input their data”, “The background image for the financial dashboard”, and “The image representing the player character in the game”.
The software is accompanied by 4 to 5 document files on average, such as dependency requirements specifications, user manuals, development logs, and software meta information.The software developed by ChatDev typically ranges from 39 to 359 lines of code, with an average of 131.61 lines222This count includes only lines that contain meaningful code, excluding blank lines..
The data suggests that ChatDev tends to produce software with relatively small-scale code. This is partly because the design of object-oriented programming, whose reusability enables code reuse through inheritance, reducing redundancy.
We also noted that when the user specified a less specific task, the resulting source code generated by ChatDev tended to be shorter, averaging around 110.97 lines. This is primarily attributed to ChatDev employing high-level logic to fulfill non-specific tasks, often generating code that focuses on providing print information for interface representation.
Therefore, we recommend providing ChatDev with specific instructions, such as desired software features, system rules, UI design, and other detailed specifications. By providing clearer and more specific instructions, users can guide ChatDev to produce more comprehensive and tailored codes that aligns with their specific requirements.
The number of environment dependencies, which indicates the external software components required, ranges from 1 to 5, with an average of 2.90 dependencies. ChatDev’s software environment typically includesnumpy,matplotlib,pandas,tkinter,pillow, orflask.
The user manual for the software consists of 31 to 232 lines, with an average of 53.96 lines. Based on our experience, the user manual commonly covers sections such asIntroduction,Quick Install,Main Features,Usage Instructions, etc,.The number of version updates for the software ranges from 5 to 42, with an average of 13.23 updates. This indicates that the source code undergoes approximately 13 modifications on average, reflecting the collaborative effort among agents in alleviating code hallucination issues throughout the software development process, including code completion, coding, and testing.
In exceptional cases where the software fails to pass the maximum number of tests, ChatDev takes proactive measures by engaging in full-scale software re-engineering. In most cases, the software development process involves 1 to 5 development cycles, with an average of 1.40 cycles.In our experiments, we effortlessly set up the sandbox environment by directly installing the required software dependencies. Subsequently, we executed the generated software using the main function. Remarkably, approximately 86.66% of the software systems executed flawlessly, showcasing the robustness and reliability of our developed software. However, a small fraction, 13.33% of the software, encountered execution failures.
Upon analyzing the failed software creations, we identified two primary contributing factors. Firstly, in 50% of the cases, the failure was attributed to the token length limit of the API. This limitation prevented obtaining the complete source code within the specified length constraint for code generation. Such challenges are particularly evident when dealing with complex software systems or scenarios requiring extensive code generation.
The remaining 50% of the failed software creations were primarily affected by external dependency issues. These challenges emerged when certain dependencies were either unavailable in the cloud or incorrectly versioned, resulting in conflicts and unavailability of specific application programming interfaces (APIs)  in the current version. These external dependency-related issues underscore the significance of meticulous management and coordination of the required software components to ensure smooth execution and functionality.
Overall, despite encountering a small percentage of failures, our experimental findings demonstrate the feasibility and effectiveness of ChatDev in generating executable software systems, with the majority of the systems successfully executing.Duration AnalysisWe conducted a duration analysis to examine the software production time for different request prompts using ChatDev. The variability in development times across prompts reflects the varying complexity and clarity of the assigned tasks. The graph in Figure6provides a visual representation of this distribution.
The longest software production duration, represented by the tallest bar on the left side of the graph, was 1030.00 seconds. This extended time was due to extensive dialogue and communication between the reviewer and programmer, leading to a detailed modification scheme. In contrast, the shortest bar on the right end of the graph indicates a minimum software development time of 169.00 seconds. This shorter duration was attributed to the absence of significant bugs and fewer dialogues during coding and testing stages.
On average, the development of small-sized software and interfaces using ChatDev took 409.84 seconds, less than 7.00 minutes. In comparison, traditional custom software development cycles, even within agile software development methods, typically require 2 to 4 weeks or even several months per cycle.Figure 6:Duration Distribution. The bars in the graph are arranged in descending order, showcasing the distribution of software development runtime for different tasks.Dialogue Statistics- In ChatDev, we employed a chat chain mechanism to facilitate software development. Each chat chain represents the production of software for a specific task and consists of multiple multi-utterance chat rounds. During these rounds, agents engage in discussions to address predefined subtasks, such as language choices, proposing solutions, and making final decisions. After completing all subtasks, a chat chain concludes with the development of the software product. For our case study tasks, we analyzed the chat chains and collected statistics, including the total number of utterances and prompt tokens used. These statistics are presented in Table2.Table 2:The statistical analysis of all dialogues in chat chains.MinMaxAvg.# Self-Reflection1.004.001.24# Utterances24.00104.0045.60# Prompt Tokens11,119.0091,208.0036,902.23# Completion Tokens3,161.0027,162.0011,567.37# Total Tokens15,294.00111,019.0048,469.60We noticed occasional instances of repetitive expressions of gratitude in the dialogue, even after reaching a consensus and making decisions. However, this phenomenon does not significantly impact the final outcome.
The self-reflection mechanism effectively allows agents to extract decision results and conclusions from the dialogue using text summarization-like abilities. This mechanism helps agents avoid unnecessary dialogue and focus on extracting meaningful information. The self-reflection number in the dialogue ranges from 1 to 4, with an average of 1.24. In most cases, agents can autonomously conclude the dialogue based on predefined communication protocols.On average, a chat chain contains 45.60 utterances, ranging from a minimum of 24 to a maximum of 104. The count of utterances encompasses discussions related to achievability of subtasks, evaluations of generated code quality, feedback on testing, advice for improvements, and the actual writing and generation of software code files and documents.
Likewise, we have observed that ChatDev tends to engage in less communication through utterances for abstract tasks compared to specific tasks, averaging around 34.40 utterances. Analysis of the dialogues revealed that during the design and coding stages, agents conducted multiple rounds of discussions to delve into the details of numerous requirements or propose modification suggestions. These discussions aimed to make informed decisions regarding the specific tasks at hand. This phenomenon aligns with real-world practices, where addressing specific tasks often involves more detailed discussions and deliberations.We monitored API interactions and token usage during software production in ChatDev. On average, ChatDev requires 36,902.23 prompt tokens, 11,567.37 completion tokens, and a total of 48,469.60 tokens to develop a single software. The average total cost in software production is approximately0.1569333Based on official API prices for July 2023..
To determine the overall cost of software development with ChatDev, we also consider the cost of designer-produced images. The average designer cost is0.1398 per software for each software production involving 8.74 graphics creations on average. Thus, the average software development cost at ChatDev is0.2967, significantly lower than traditional custom software development companies’ expenses.Reviewer-Programmer Dialogue AnalysisIn this section, we delve into the primary exchanges between the reviewer and the programmer, specifically concerning code-related matters during the coding phase. We summarize the reviewer’s evaluations of the programmer’s source code at the coding stage.
Figure7provides a visual representation of the reviewer’s suggestions in the form of pie charts. As depicted in the figure, the most frequently discussed issue in the reviewer-programmer communication during code review is “methods not implemented” (34.85%) . This challenge commonly arises in code generation for complex models, where core functionalities often receive placeholder labels (such as “pass” in Python)  to be further completed. Additionally, the dialogue frequently addresses the topic of “modules not imported” (19.70%) . This issue emerges from the nature of code generation, where the generated code tends to overlook minor details. However, in the context of code generation, ensuring the code’s executability becomes crucial. Fortunately, the thought instruction mechanism proposed in this paper effectively tackles these issues by compelling the reviewer to identify incomplete methods and requiring the programmer to fill them. This mechanism can be applied to other scenarios where tasks are completed based on large models but with certain parts missing.
Interestingly, the reviewer also emphasizes the importance of code robustness. They underscore considerations for handling potential exceptions in the future and offer hints on avoiding duplicate categories (3.03%) . Additionally, the reviewer provides suggestions regarding unused classes in the code (1.52%) , identifies infinite loops (1.52%) , and emphasizes the necessity of proper environment initialization (1.52%) .Figure 7:Distribution of Reviewer’s Suggestions. Each color in the pie chart represents a specific category of suggestions provided by the reviewer.Tester-Programmer Dialogue AnalysisIn a similar fashion, we analyze the debug dialogue between the tester and the programmer during the testing phase and categorize the main types of bugs encountered. The results are presented in Figure8.
As observed in the figure, the most frequent debug issue between the tester and the programmer is “module not found” (45.76%) , accounting for nearly half of the cases. This reflects the model’s tendency to overlook very fine details, despite their simplicity. Fortunately, with the thought instruction mechanism proposed in this paper, such bugs can often be easily resolved by importing the required class or method.
The second most common types of errors are “attribute error” and “unknown option”, each accounting for 15.25% of the cases. “attribute error” refers to errors in the usage of class attributes, while “unknown option” indicates errors in the parameters of method calls. Another common type of error is “import error” which is similar to “module not found” and is primarily caused by mistakes in the import statements, such as importing the wrong class or using an incorrect import path.
In addition to these common error types, ChatDev has the capability to detect relatively rare error types such as improperly initialized GUI (5.08%) , incorrect method calling (1.69%) , missing file dependencies (1.69%) , unused modules (1.69%) , decorator syntax errors (1.69%) , and more.Figure 8:Distribution of Tester’s Suggestions. Each color in the pie chart represents a specific category of bugs provided by the tester.Case StudyFigure9showcases an example of ChatDev developing a Gomoku game (a.k.a.also known as “Five in a Row” and “Gobang”) . In the left, we see the result of a naive software created without GUI. This version of the game can only be played through a command terminal, limiting its interactivity and overall enjoyment.
In contrast, by incorporating GUI design, ChatDev can create a visually appealing small game. This version surpasses the interface-less version in terms of interactivity and user experience, providing a more enjoyable and engaging gameplay environment.
Furthermore, ChatDev’s designer can assist the programmer in creating additional graphics to enhance the GUI’s aesthetics and usability, without compromising its functionality. These graphics, carefully crafted by the designer, contribute to making the GUI more visually pleasing and user-friendly.Figure 9:The producted software of the task: “design a basic Gomoku game”.Additionally, if human users are unsatisfied with the images created by the art designer, they have the flexibility to manually replace the original images after ChatDev completes the software. This allows for further customization according to users’ preferences, without affecting the software’s core functionality. Users can tailor the visual elements to their liking, resulting in a personalized software experience that aligns with their individual preferences.For a more comprehensive understanding, we exemplify the dialogue processes that make programming language choices in designing.
More exemplary dialogues extracted from the chat chain of the Gomoku game are shown in AppendixA, including the prompts we designed and the dialogue process between agents at each phase. Please note that, due to space constraints, we only display key information during the dialogue, omitting overly fine-grained details.Designing: Programming Language: CEO (Chief Executive Officer) : CTO (Chief Technology Officer) {dialogue}\speakTo satisfy the new user’s demand and make a desktop application realizable, you should propose a concrete programming language.\speakPython with the Pygame library is a suitable choice for implementing a basic Gomoku game.\speakGreat! Python is a versatile and widely-used programming language that will be suitable for implementing a basic Gomoku game. Its simplicity and readability make it a popular choice for beginners and experienced developers alike.\speakLet’s get started with the development of the basic Gomoku game in Python using the Pygame library!\speak<END> Python.
body
Communicative Agents for Software Development
3Experiments
2307.07924
4NLDD DatasetFigure 10:The three-stage process of NLDD creation. We only show the generated names of software and the prompt in the figure is for example only.We collect and open-source444The data is available at https://github.com/OpenBMB/ChatDev/tree/main/NLDD.a large and diverse dataset named NLDD (Natural Language Dataset for Dev) , which contains 1,200 software prompt data for the Natural Language to Software (NL2Software)  task. Each sample in NLDD includes the name, description, and category of the software.NLDD is created by prompting ChatGPT with a three-stage strategy and well-designed rules. We collect the main software category from four prominent software store platforms including Ubuntu Snap Shop, Google Play Store, Microsoft Store, and Apple App Store. We further sorted out five major categories with 40 subcategories and asked ChatGPT to generate software data for these categories. See Figure11in the appendix for all the category details.To circumvent the generation of repetitive content, NLDD is created with a Query Prompt-based three-stage strategy, including random sampling, prompt sampling, and check. As shown in Figure10, this strategy initially establishes datasets by random sampling some software data, then records existing data, granting ChatGPT autonomy to produce novel entries.1.Random Sampling: First, ChatGPT is independently inquired multiple times to obtain software information under a certain category, and then the duplication is removed at the token granularity of the software name.2.Sequential Sampling: Then we add the generated software information in sequence in the form of negative prompts, requiring ChatGPT to continue generating unique software information.3.Check: Although ChatGPT has been required to follow certain rules when generating, LLM is more likely to be overconfident when generating according to rules than when judging based on rules. Therefore, our last step is to let ChatGPT determine whether the generated software follows the rules.NLDD is created with human-designed rules that make the created software easy for researchers to evaluate, for example, the collected software does not need internet or multi-player participation. It is curated to facilitate research in NL2Software. We also give a visualization and analysis of the created software description in the appendix (see Figure12and13) .
body
Communicative Agents for Software Development
4NLDD Dataset
2307.07924
5DiscussionEven though ChatDev offers a novel paradigm for software development that is training-free, efficient, and cost-effective, we recognize the presence of potential risks and limitations that require further investigation and resolution.Even when we set the temperature parameter of the large language model to a very low value, we observe inherent randomness in the generated output. Consequently, each software produced may vary between different runs. As a result, this technology is best suited for open and creative software production scenarios where variations are acceptable.
Moreover, there are instances where the software fails to meet the users’ needs. This can be attributed to unclear user requirements and the inherent randomness in text or code generation.While the designer agent is capable of creating images, it is important to acknowledge that the directly generated images may not always enhance the GUI’s aesthetics. At times, they may introduce excessive complexity, which can hinder user experience. This is primarily because each image is generated independently, lacking direct visual correlation. To address this, we have provided the option for users to customize the GUI as a system hyperparameter, allowing them to decide whether to enable this feature or not.Additionally, the large language model may exhibit inherent biases, leading to the generation of code patterns that do not necessarily align with the problem-solving thinking of real programmers.
Regarding risks, it is important to note that existing large language models are not fully tuned to be harmless, making them vulnerable to potential misuse by malicious users for harmful purposes. Furthermore, the generated software currently lacks malicious intent identification for sensitive file operations. Therefore, users are advised to conduct their own code review before running the software to prevent any unnecessary data loss.Additionally, the assessment of our ChatDev framework’s software-level task completion capabilities presents formidable challenges, owing to the vast scope and heterogeneous nature of the generated tasks. This mandates the active participation of a multitude of domain experts.Although the study may potentially help junior programmers or engineers in real world, it is challenging for the system to generate perfect source code for high-level or large-scale software requirements. This difficulty arises from the agents’ limited ability to autonomously determine specific implementation details, often resulting in multiple rounds of lengthy discussions. Additionally, large-scale software development proves challenging for both reviewers and testers, as it becomes difficult to identify defects or vulnerabilities within the given time constraints.
body
Communicative Agents for Software Development
5Discussion
2307.07924
6Related WorkDeep-Learning-based Software EngineeringSoftware engineering (SE)  is the process of designing, developing, testing and maintaining software in a methodical, rigorous, and measurable manner555www.computer.org/sevocab.
Due to the complexity of software engineering, a significant number of decisions are made based on intuition and, at best, consultation with senior developers
With the rapid development of the deep learning (DL)  technique, many researchers are devoted to apply DL into SE to improve the effectiveness and efficiency of software development, reducing labor cost.
Existing DL-based SE work focuses on five SE stages of the life cycle in software engineering separately:
(1) Software requirementsis to analysis the user demands and specify the requirements for the software.
(2) Software designinvolves the specification of the software framework, modules, protocols, and other features that are necessary for the development of a software.
(3) Software implementationis the detailed creation procedure of the software to implement the design.
(4) Software testingis to verify that the software can provide expected behaviors on a set of test cases.
(5) Software maintenanceis to provide necessary support for software users, e.g., documentation generation.
Despite the impressive performance by adapting DL method into SE, these approaches are isolated, which is only able to accomplish a specific step of the whole procedure of software engineering.
Not to mention these DL-based methods require large-scale task-specialized training data to achieve the certain goal, which is unpractical to collect extensive data for the whole procedure of software engineering.Multi-Agent CollaborationLarge language models (LLMs)  have exhibited remarkable proficiency across a wide range of domains.
Recently, there exist several work has explored that utilizing the interactions between LLMs to achieve several goals.
(1) Behaviour simulation:
Parket al.create multiple generative agents with a sandbox environment to simulate believable human behavior.
Wanget al.use multiple agents to simulate the user behaviours in the recommendation scenario.
(2) Data construction:
Weiet al.assign agents with different roles to collect and evaluate multi-party conversations. Liet al.propose a role-playing framework which leverages agents to generate diverse and detailed instructions for complicated tasks.
(3) Performance improvement:
Salewskiet al.find that asking the agent to take on different roles can improve their performance.
Duet al.improve the factual correctness and reasoning accuracy by leveraging multi-agent debate.
Lianget al.use multiple agents to debate each other to solve the degeneration-of-thought problem in self-reflection.
Fuet al.find that multiple agents can improve each other in a negotiation game like buyer-seller dealing by role-playing and learning from the agent feedback.
Liuet al.design a simulated social interaction sandbox to achieve social alignment for LLMs.
Talebiradet al.introduce multiple agents with unique attributes and roles to handle complex tasks in a black box environment.
body
Communicative Agents for Software Development
6Related Work
2307.07924
7ConclusionIn this study, we have presented ChatDev, a chat-based end-to-end software development framework that leverages LLMs to facilitate effective communication and collaboration among multiple roles involved in the software development process. By decomposing the development process into sequential atomic subtasks through the use of the chat chain, ChatDev enables granular focus and promotes desired outputs for each subtask. Additionally, the thought instruction mechanism alleviates challenges related to code hallucinations by guiding programmers through specific code modifications during code completion, reviewing, and testing.
Our experimental results demonstrate the efficiency and cost-effectiveness of the automated software development process driven by ChatDev.
By employing multiple software agents with different roles, we have proposed a new paradigm in generating software systems, alleviating code vulnerabilities, and identifying and resolving potential bugs. The collaborative interactions and mutual examination between roles within each chat have contributed to effective decision-making for each subtask.Moving forward, further research can focus on refining the communication protocols and optimizing the interaction dynamics within each chat to enhance the performance and effectiveness of ChatDev. Additionally, exploring the integration of other emerging technologies, such as reinforcement learning and explainable AI, could provide valuable insights into addressing challenges and improving the overall software development process.
Our research will persist in exploring enhancements and advancements in ChatDev agents, workflow, and development environments. The overarching objective is to achieve even greater efficiency in software production by improving various characteristics, such as reducing the length of chat chains or optimizing subtask solving logic and strategies, ultimately leading to more streamlined and effective software production processes.
We hope the potential of the proposed natural-language-to-software framework can illuminate fresh possibilities for integrating LLMs into software development and mark the dawn of a new frontier in the field of natural language processing, software engineering, and collective intelligence.
body
Communicative Agents for Software Development
7Conclusion
2307.07924
ContributionsThe authors’ contributions are delineated as follows: During the project’s formulation, Chen Qian, Xin Cong, and Cheng Yang orchestrated the design of the model architecture. In the process of refining the model’s structure, Dahai Li, Zhiyuan Liu, and Maosong Sun provided invaluable guidance. The main paper was composed by Chen Qian, Xin Cong, Weize Chen, Yusheng Su, and Juyuan Xu, with input from Cheng Yang, Weize Chen, Yusheng Su, Zhiyuan Liu, and Maosong Sun to enhance its clarity. To enhance public accessibility, Wei Liu, Yufan Dang, and Jiahao Li championed the open-source repository through comprehensive testing; Wei Liu restructured and optimized the system. Additionally, Wei Liu and Yufan Dang spearheaded the development of the online demo to ensure wider dissemination.
body
Communicative Agents for Software Development
Contributions
2307.07924
AcknowledgementsWe thank Yujia Qin, Shengding Hu, Yankai Lin, Bowen Li, Jingwei Zuo, Xuanhe Zhou, Shuo Wang, Qimin Zhan, and Yukun Yan for their active participation in various discussions and providing valuable feedback on this research.
We also express our gratitude to theAgentVerse,CamelandGatherprojects for providing the initial foundation for this project.
conclusion
Communicative Agents for Software Development
Acknowledgements