<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://rocknroll009.github.io/til/feed.xml" rel="self" type="application/atom+xml" /><link href="https://rocknroll009.github.io/til/" rel="alternate" type="text/html" /><updated>2026-02-08T02:34:38+09:00</updated><id>https://rocknroll009.github.io/til/feed.xml</id><title type="html">Inf. 00’s TIL</title><subtitle>Things I&apos;ve learned.</subtitle><entry><title type="html">Multiple git account 깃 복수계정</title><link href="https://rocknroll009.github.io/til/2026/02/04/multiple-git/" rel="alternate" type="text/html" title="Multiple git account 깃 복수계정" /><published>2026-02-04T00:00:00+09:00</published><updated>2026-02-04T00:00:00+09:00</updated><id>https://rocknroll009.github.io/til/2026/02/04/multiple-git</id><content type="html" xml:base="https://rocknroll009.github.io/til/2026/02/04/multiple-git/"><![CDATA[<p>The cleanest ways to use <strong>multiple Git accounts locally</strong> are usually these two:</p>

<ol>
  <li><strong>Separate SSH keys per account</strong> (recommended — the most reliable)</li>
  <li>Use different <strong>user.name / user.email per repository</strong> (this only changes the commit author — push permissions/auth are separate)</li>
</ol>

<p>Below is a standard setup for the case where <strong>both Account A and Account B are GitHub accounts</strong>, fully separated using SSH.</p>

<hr />

<h2 id="1-generate-ssh-keys-for-each-account">1) Generate SSH keys for each account</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh-keygen <span class="nt">-t</span> ed25519 <span class="nt">-C</span> <span class="s2">"accountA@email.com"</span> <span class="nt">-f</span> ~/.ssh/id_ed25519_github_a
ssh-keygen <span class="nt">-t</span> ed25519 <span class="nt">-C</span> <span class="s2">"accountB@email.com"</span> <span class="nt">-f</span> ~/.ssh/id_ed25519_github_b
</code></pre></div></div>

<hr />

<h2 id="2-create-host-aliases-in-sshconfig">2) Create host aliases in <code class="language-text highlighter-rouge">~/.ssh/config</code></h2>

<pre><code class="language-sshconfig">Host github-a
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_a
  IdentitiesOnly yes

Host github-b
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_b
  IdentitiesOnly yes
</code></pre>

<hr />

<h2 id="3-add-the-public-keys-to-each-github-account">3) Add the public keys to each GitHub account</h2>

<p>Copy each public key and add it in GitHub → <strong>Settings → SSH and GPG keys</strong>.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> ~/.ssh/id_ed25519_github_a.pub
<span class="nb">cat</span> ~/.ssh/id_ed25519_github_b.pub
</code></pre></div></div>

<hr />

<h2 id="4-test-the-connection">4) Test the connection</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh <span class="nt">-T</span> git@github-a
ssh <span class="nt">-T</span> git@github-b
</code></pre></div></div>

<p>If you see “Hi username!” for each one, it worked.</p>

<hr />

<h2 id="5-decide-which-account-the-repo-should-use-cloneconnect">5) Decide which account the repo should use (clone/connect)</h2>

<p>For example, if you want to push using Account B:</p>

<h3 id="when-cloning-a-new-repo">When cloning a new repo</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone git@github-b:USERNAME/REPO.git
</code></pre></div></div>

<h3 id="if-the-repo-is-already-cloned-just-change-the-remote-url">If the repo is already cloned, just change the remote URL</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git remote set-url origin git@github-b:USERNAME/REPO.git
</code></pre></div></div>

<hr />

<h2 id="6-separate-commit-author-per-repository-optional">6) Separate commit author per repository (optional)</h2>

<p>Inside the repo folder:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config user.name <span class="s2">"AccountB Name"</span>
git config user.email <span class="s2">"accountB@email.com"</span>
</code></pre></div></div>

<p>Check:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config user.name
git config user.email
git remote <span class="nt">-v</span>
</code></pre></div></div>

<hr />

<h2 id="key-takeaway-for-a-github-pages-repo">Key takeaway for a GitHub Pages repo</h2>

<ul>
  <li><strong>Push authentication (permissions/login)</strong> is determined by whether <code class="language-text highlighter-rouge">origin</code> uses <code class="language-text highlighter-rouge">git@github-a:</code> or <code class="language-text highlighter-rouge">git@github-b:</code></li>
  <li><strong>The email shown in commits</strong> is determined by <code class="language-text highlighter-rouge">git config user.email</code></li>
</ul>]]></content><author><name></name></author><category term="git" /><summary type="html"><![CDATA[The cleanest ways to use multiple Git accounts locally are usually these two:]]></summary></entry><entry><title type="html">openclaw local에서 test</title><link href="https://rocknroll009.github.io/til/2026/02/04/openclaw/" rel="alternate" type="text/html" title="openclaw local에서 test" /><published>2026-02-04T00:00:00+09:00</published><updated>2026-02-04T00:00:00+09:00</updated><id>https://rocknroll009.github.io/til/2026/02/04/openclaw</id><content type="html" xml:base="https://rocknroll009.github.io/til/2026/02/04/openclaw/"><![CDATA[<ul>
  <li>openclaw를 local에서 lmstudio 테스트하면서 TIL</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># mac에서 docker start</span>
colima start
docker info


<span class="c"># docker-compose symlink</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> ~/.docker/cli-plugins
<span class="nb">ln</span> <span class="nt">-sf</span> <span class="s2">"</span><span class="si">$(</span>which docker-compose<span class="si">)</span><span class="s2">"</span> ~/.docker/cli-plugins/docker-compose
docker compose version
brew <span class="nb">install </span>bash


<span class="c"># docker에서 테스트</span>
<span class="c"># 결국 docker에서 local llm 돌리는 것은 포기</span>
docker compose up <span class="nt">-d</span> openclaw-gateway
docker compose logs <span class="nt">-f</span> <span class="nt">--tail</span><span class="o">=</span>200 openclaw-gateway
docker compose up openclaw-gateway
docker compose run <span class="nt">--rm</span> openclaw-cli dashboard <span class="nt">--no-open</span>


<span class="c"># repo clone 사용</span>
node dist/index.js onboard
node dist/index.jso
node dist/index.jso tui


<span class="c"># telegram 에러: docker에 openclaw 열어둬서 에러였음</span>
For the Telegram 409 Conflict:
This usually means another instance is already connected. Check <span class="k">for </span>running processes:
ps aux | <span class="nb">grep </span>clawdbot
ps aux | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s2">"openclaw</span><span class="se">\|</span><span class="s2">dist/index.js"</span> | <span class="nb">grep</span> <span class="nt">-v</span> <span class="nb">grep</span>

<span class="c"># reference</span>
config: https://docs.openclaw.ai/gateway/configuration-examples
openclaw with vllm: https://unsloth.ai/docs/models/glm-4.7-flash
browser doc: https://docs.openclaw.ai/tools/browser
</code></pre></div></div>

<hr />

<ul>
  <li>lm studio하려면 아래 .openclaw/openclaw.json 설정해야함</li>
</ul>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">  </span><span class="nl">"models"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"mode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"merge"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"providers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"lmstudio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"baseUrl"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://127.0.0.1:1234/v1"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"apiKey"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lm-studio"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"api"</span><span class="p">:</span><span class="w"> </span><span class="s2">"openai-responses"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"models"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
          </span><span class="p">{</span><span class="w">
            </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"nvidia/nemotron-3-nano"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lmstudio"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"reasoning"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
            </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
              </span><span class="s2">"text"</span><span class="w">
            </span><span class="p">],</span><span class="w">
            </span><span class="nl">"cost"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
              </span><span class="nl">"output"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
              </span><span class="nl">"cacheRead"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
              </span><span class="nl">"cacheWrite"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"contextWindow"</span><span class="p">:</span><span class="w"> </span><span class="mi">16000</span><span class="p">,</span><span class="w">
            </span><span class="nl">"maxTokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">16000</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">]</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="err">,</span><span class="w">
  </span><span class="nl">"agents"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"defaults"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"primary"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lmstudio/nvidia/nemotron-3-nano"</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"models"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"lmstudio/nvidia/nemotron-3-nano"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"alias"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Nemotron 3 Nano"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"workspace"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/Users/user/.openclaw/workspace"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"compaction"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"mode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"safeguard"</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"maxConcurrent"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
      </span><span class="nl">"subagents"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"maxConcurrent"</span><span class="p">:</span><span class="w"> </span><span class="mi">8</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="err">,</span><span class="w">
</span></code></pre></div></div>]]></content><author><name></name></author><category term="openclaw" /><summary type="html"><![CDATA[openclaw를 local에서 lmstudio 테스트하면서 TIL]]></summary></entry><entry><title type="html">LangGraph 맛보기 feat. tool 디버깅</title><link href="https://rocknroll009.github.io/til/2026/02/04/langgraph/" rel="alternate" type="text/html" title="LangGraph 맛보기 feat. tool 디버깅" /><published>2026-02-04T00:00:00+09:00</published><updated>2026-02-04T00:00:00+09:00</updated><id>https://rocknroll009.github.io/til/2026/02/04/langgraph</id><content type="html" xml:base="https://rocknroll009.github.io/til/2026/02/04/langgraph/"><![CDATA[<h3 id="langgraph-2가지-사용법">LangGraph 2가지 사용법</h3>
<ul>
  <li><code class="language-text highlighter-rouge">graph api</code>: state, nodes and edges</li>
  <li><code class="language-text highlighter-rouge">functional api</code>: persistence, memory, human-in-the-loop, and streaming</li>
  <li>대개 <code class="language-text highlighter-rouge">graph api</code> 사용함.</li>
  <li><code class="language-text highlighter-rouge">functional api</code>는 이미 다른 코드가 있고, 거기에 langgraph 접붙일 때, 코드 수정 최소화를 위해 사용</li>
</ul>

<hr />

<ul>
  <li>
    <p><code class="language-text highlighter-rouge">graph api</code> Example code</p>

    <details>
      <summary>코드 보기</summary>

      <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Step 1: Define tools and model
</span>
<span class="kn">from</span> <span class="nn">langchain.tools</span> <span class="kn">import</span> <span class="n">tool</span>
<span class="kn">from</span> <span class="nn">langchain.chat_models</span> <span class="kn">import</span> <span class="n">init_chat_model</span>


<span class="n">model</span> <span class="o">=</span> <span class="n">init_chat_model</span><span class="p">(</span>
    <span class="s">"claude-sonnet-4-5-20250929"</span><span class="p">,</span>
    <span class="n">temperature</span><span class="o">=</span><span class="mi">0</span>
<span class="p">)</span>


<span class="c1"># Define tools
</span><span class="o">@</span><span class="n">tool</span>
<span class="k">def</span> <span class="nf">multiply</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
    <span class="s">"""Multiply `a` and `b`.

    Args:
        a: First int
        b: Second int
    """</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span>


<span class="o">@</span><span class="n">tool</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
    <span class="s">"""Adds `a` and `b`.

    Args:
        a: First int
        b: Second int
    """</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>


<span class="o">@</span><span class="n">tool</span>
<span class="k">def</span> <span class="nf">divide</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
    <span class="s">"""Divide `a` and `b`.

    Args:
        a: First int
        b: Second int
    """</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span>


<span class="c1"># Augment the LLM with tools
</span><span class="n">tools</span> <span class="o">=</span> <span class="p">[</span><span class="n">add</span><span class="p">,</span> <span class="n">multiply</span><span class="p">,</span> <span class="n">divide</span><span class="p">]</span>
<span class="n">tools_by_name</span> <span class="o">=</span> <span class="p">{</span><span class="n">tool</span><span class="p">.</span><span class="n">name</span><span class="p">:</span> <span class="n">tool</span> <span class="k">for</span> <span class="n">tool</span> <span class="ow">in</span> <span class="n">tools</span><span class="p">}</span>
<span class="n">model_with_tools</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="n">bind_tools</span><span class="p">(</span><span class="n">tools</span><span class="p">)</span>

<span class="c1"># Step 2: Define state
</span>
<span class="kn">from</span> <span class="nn">langchain.messages</span> <span class="kn">import</span> <span class="n">AnyMessage</span>
<span class="kn">from</span> <span class="nn">typing_extensions</span> <span class="kn">import</span> <span class="n">TypedDict</span><span class="p">,</span> <span class="n">Annotated</span>
<span class="kn">import</span> <span class="nn">operator</span>


<span class="k">class</span> <span class="nc">MessagesState</span><span class="p">(</span><span class="n">TypedDict</span><span class="p">):</span>
    <span class="n">messages</span><span class="p">:</span> <span class="n">Annotated</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="n">AnyMessage</span><span class="p">],</span> <span class="n">operator</span><span class="p">.</span><span class="n">add</span><span class="p">]</span>
    <span class="n">llm_calls</span><span class="p">:</span> <span class="nb">int</span>

<span class="c1"># Step 3: Define model node
</span><span class="kn">from</span> <span class="nn">langchain.messages</span> <span class="kn">import</span> <span class="n">SystemMessage</span>


<span class="k">def</span> <span class="nf">llm_call</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
    <span class="s">"""LLM decides whether to call a tool or not"""</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="s">"messages"</span><span class="p">:</span> <span class="p">[</span>
            <span class="n">model_with_tools</span><span class="p">.</span><span class="n">invoke</span><span class="p">(</span>
                <span class="p">[</span>
                    <span class="n">SystemMessage</span><span class="p">(</span>
                        <span class="n">content</span><span class="o">=</span><span class="s">"You are a helpful assistant tasked with performing arithmetic on a set of inputs."</span>
                    <span class="p">)</span>
                <span class="p">]</span>
                <span class="o">+</span> <span class="n">state</span><span class="p">[</span><span class="s">"messages"</span><span class="p">]</span>
            <span class="p">)</span>
        <span class="p">],</span>
        <span class="s">"llm_calls"</span><span class="p">:</span> <span class="n">state</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'llm_calls'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
    <span class="p">}</span>


<span class="c1"># Step 4: Define tool node
</span>
<span class="kn">from</span> <span class="nn">langchain.messages</span> <span class="kn">import</span> <span class="n">ToolMessage</span>


<span class="k">def</span> <span class="nf">tool_node</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
    <span class="s">"""Performs the tool call"""</span>

    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">tool_call</span> <span class="ow">in</span> <span class="n">state</span><span class="p">[</span><span class="s">"messages"</span><span class="p">][</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">tool_calls</span><span class="p">:</span>
        <span class="n">tool</span> <span class="o">=</span> <span class="n">tools_by_name</span><span class="p">[</span><span class="n">tool_call</span><span class="p">[</span><span class="s">"name"</span><span class="p">]]</span>
        <span class="n">observation</span> <span class="o">=</span> <span class="n">tool</span><span class="p">.</span><span class="n">invoke</span><span class="p">(</span><span class="n">tool_call</span><span class="p">[</span><span class="s">"args"</span><span class="p">])</span>
        <span class="n">result</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">ToolMessage</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">observation</span><span class="p">,</span> <span class="n">tool_call_id</span><span class="o">=</span><span class="n">tool_call</span><span class="p">[</span><span class="s">"id"</span><span class="p">]))</span>
    <span class="k">return</span> <span class="p">{</span><span class="s">"messages"</span><span class="p">:</span> <span class="n">result</span><span class="p">}</span>

<span class="c1"># Step 5: Define logic to determine whether to end
</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Literal</span>
<span class="kn">from</span> <span class="nn">langgraph.graph</span> <span class="kn">import</span> <span class="n">StateGraph</span><span class="p">,</span> <span class="n">START</span><span class="p">,</span> <span class="n">END</span>


<span class="c1"># Conditional edge function to route to the tool node or end based upon whether the LLM made a tool call
</span><span class="k">def</span> <span class="nf">should_continue</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="n">MessagesState</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Literal</span><span class="p">[</span><span class="s">"tool_node"</span><span class="p">,</span> <span class="n">END</span><span class="p">]:</span>
    <span class="s">"""Decide if we should continue the loop or stop based upon whether the LLM made a tool call"""</span>

    <span class="n">messages</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="s">"messages"</span><span class="p">]</span>
    <span class="n">last_message</span> <span class="o">=</span> <span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

    <span class="c1"># If the LLM makes a tool call, then perform an action
</span>    <span class="k">if</span> <span class="n">last_message</span><span class="p">.</span><span class="n">tool_calls</span><span class="p">:</span>
        <span class="k">return</span> <span class="s">"tool_node"</span>

    <span class="c1"># Otherwise, we stop (reply to the user)
</span>    <span class="k">return</span> <span class="n">END</span>

<span class="c1"># Step 6: Build agent
</span>
<span class="c1"># Build workflow
</span><span class="n">agent_builder</span> <span class="o">=</span> <span class="n">StateGraph</span><span class="p">(</span><span class="n">MessagesState</span><span class="p">)</span>

<span class="c1"># Add nodes
</span><span class="n">agent_builder</span><span class="p">.</span><span class="n">add_node</span><span class="p">(</span><span class="s">"llm_call"</span><span class="p">,</span> <span class="n">llm_call</span><span class="p">)</span>
<span class="n">agent_builder</span><span class="p">.</span><span class="n">add_node</span><span class="p">(</span><span class="s">"tool_node"</span><span class="p">,</span> <span class="n">tool_node</span><span class="p">)</span>

<span class="c1"># Add edges to connect nodes
</span><span class="n">agent_builder</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="n">START</span><span class="p">,</span> <span class="s">"llm_call"</span><span class="p">)</span>
<span class="n">agent_builder</span><span class="p">.</span><span class="n">add_conditional_edges</span><span class="p">(</span>
    <span class="s">"llm_call"</span><span class="p">,</span>
    <span class="n">should_continue</span><span class="p">,</span>
    <span class="p">[</span><span class="s">"tool_node"</span><span class="p">,</span> <span class="n">END</span><span class="p">]</span>
<span class="p">)</span>
<span class="n">agent_builder</span><span class="p">.</span><span class="n">add_edge</span><span class="p">(</span><span class="s">"tool_node"</span><span class="p">,</span> <span class="s">"llm_call"</span><span class="p">)</span>

<span class="c1"># Compile the agent
</span><span class="n">agent</span> <span class="o">=</span> <span class="n">agent_builder</span><span class="p">.</span><span class="nb">compile</span><span class="p">()</span>


<span class="kn">from</span> <span class="nn">IPython.display</span> <span class="kn">import</span> <span class="n">Image</span><span class="p">,</span> <span class="n">display</span>
<span class="c1"># Show the agent
</span><span class="n">display</span><span class="p">(</span><span class="n">Image</span><span class="p">(</span><span class="n">agent</span><span class="p">.</span><span class="n">get_graph</span><span class="p">(</span><span class="n">xray</span><span class="o">=</span><span class="bp">True</span><span class="p">).</span><span class="n">draw_mermaid_png</span><span class="p">()))</span>

<span class="c1"># Invoke
</span><span class="kn">from</span> <span class="nn">langchain.messages</span> <span class="kn">import</span> <span class="n">HumanMessage</span>
<span class="n">messages</span> <span class="o">=</span> <span class="p">[</span><span class="n">HumanMessage</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="s">"Add 3 and 4."</span><span class="p">)]</span>
<span class="n">messages</span> <span class="o">=</span> <span class="n">agent</span><span class="p">.</span><span class="n">invoke</span><span class="p">({</span><span class="s">"messages"</span><span class="p">:</span> <span class="n">messages</span><span class="p">})</span>
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">messages</span><span class="p">[</span><span class="s">"messages"</span><span class="p">]:</span>
    <span class="n">m</span><span class="p">.</span><span class="n">pretty_print</span><span class="p">()</span>
</code></pre></div>      </div>

    </details>
  </li>
</ul>

<hr />

<h3 id="tool-call-탐구">tool call 탐구</h3>

<ul>
  <li>ministral 모델 학습시 아마 아래와 같은 학습을 했을 것:</li>
</ul>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[INST] What's 2+2? [/INST]
[TOOL_CALLS]  # &lt;- 아래 log 보면 이 token이 생성되는 것을 확인할 수 있음
 [{"name": "calculator", "arguments": {...}}]
</code></pre></div></div>
<ul>
  <li>위와 같은 tool use 학습하지 않은 모델은 agent 모델로 사용이 불가능함</li>
  <li>tool call 할 때 실제 message body</li>
  <li>lm studio 사용해서 디버깅해봄</li>
</ul>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">16</span><span class="w"> </span><span class="p">[</span><span class="err">DEBUG</span><span class="p">]</span><span class="w">
 </span><span class="err">Received</span><span class="w"> </span><span class="err">request:</span><span class="w"> </span><span class="err">POST</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">/v</span><span class="mi">1</span><span class="err">/chat/completions</span><span class="w"> </span><span class="err">with</span><span class="w"> </span><span class="err">body</span><span class="w">  </span><span class="p">{</span><span class="w">
  </span><span class="nl">"messages"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"You are a helpful assistant"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"system"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1*2"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"user"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"mistralai/ministral-3-14b-reasoning"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"stream"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
  </span><span class="nl">"temperature"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
  </span><span class="nl">"tools"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"add"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Adds `a` and `b`.</span><span class="se">\n\n</span><span class="s2">    Args:</span><span class="se">\n</span><span class="s2">        a: First int</span><span class="se">\n</span><span class="s2">        b: Second int"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"a"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"b"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">}</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"a"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"b"</span><span class="w">
          </span><span class="p">],</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"multiply"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Multiply `a` and `b`.</span><span class="se">\n\n</span><span class="s2">    Args:</span><span class="se">\n</span><span class="s2">        a: First int</span><span class="se">\n</span><span class="s2">        b: Second int"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"a"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"b"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">}</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"a"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"b"</span><span class="w">
          </span><span class="p">],</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"divide"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Divide `a` and `b`.</span><span class="se">\n\n</span><span class="s2">    Args:</span><span class="se">\n</span><span class="s2">        a: First int</span><span class="se">\n</span><span class="s2">        b: Second int"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"a"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"b"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">}</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"a"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"b"</span><span class="w">
          </span><span class="p">],</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="err">#</span><span class="w"> </span><span class="err">모델의</span><span class="w"> </span><span class="err">tool</span><span class="w"> </span><span class="err">call</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">17</span><span class="w"> </span><span class="p">[</span><span class="err">DEBUG</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">SamplingSwitch</span><span class="p">]</span><span class="w"> </span><span class="err">Entering</span><span class="w"> </span><span class="err">switch</span><span class="w"> </span><span class="err">'mistralV</span><span class="mi">13</span><span class="err">ToolsSamplingSwitch'</span><span class="w"> </span><span class="err">(triggered</span><span class="w"> </span><span class="err">by</span><span class="w"> </span><span class="err">string:</span><span class="w"> </span><span class="s2">"[TOOL_CALLS]"</span><span class="err">)</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="err">&lt;-----------</span><span class="w"> </span><span class="err">tool</span><span class="w"> </span><span class="err">call</span><span class="w"> </span><span class="err">토큰</span><span class="w"> </span><span class="err">생성함.</span><span class="w"> </span><span class="err">tool</span><span class="w"> </span><span class="err">use</span><span class="w"> </span><span class="err">학습의</span><span class="w"> </span><span class="err">산물.</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">17</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Start</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">generate</span><span class="w"> </span><span class="err">a</span><span class="w"> </span><span class="err">tool</span><span class="w"> </span><span class="err">call...</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">18</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Tool</span><span class="w"> </span><span class="err">name</span><span class="w"> </span><span class="err">generated:</span><span class="w">  </span><span class="err">multiply</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">18</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Accumulating</span><span class="w"> </span><span class="err">tool</span><span class="w"> </span><span class="err">call</span><span class="w"> </span><span class="err">arguments:</span><span class="w">  </span><span class="p">{</span><span class="s2">"
...
 [mistralai/ministral-3-14b-reasoning] Accumulating tool call arguments:  {"</span><span class="err">a</span><span class="s2">": 1, "</span><span class="err">b</span><span class="s2">": 2}
2026-02-08 01:13:18  [INFO]
 [mistralai/ministral-3-14b-reasoning] Model generated a tool call.
2026-02-08 01:13:18  [INFO]
 [mistralai/ministral-3-14b-reasoning] Model generated tool calls:  [multiply(a=1, b=2)]

# 모델 response
2026-02-08 01:13:18  [INFO]
 [mistralai/ministral-3-14b-reasoning] Generated prediction:  {
  "</span><span class="err">id</span><span class="s2">": "</span><span class="err">chatcmpl</span><span class="mi">-37</span><span class="err">bu</span><span class="mi">06198</span><span class="err">lu</span><span class="mi">6</span><span class="err">b</span><span class="mi">9</span><span class="err">atpcug</span><span class="mi">9</span><span class="err">i</span><span class="s2">",
  "</span><span class="err">object</span><span class="s2">": "</span><span class="err">chat.completion</span><span class="s2">",
  "</span><span class="err">created</span><span class="s2">": 1770480796,
  "</span><span class="err">model</span><span class="s2">": "</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="s2">",
  "</span><span class="err">choices</span><span class="s2">": [
    {
      "</span><span class="err">index</span><span class="s2">": 0,
      "</span><span class="err">message</span><span class="s2">": {
        "</span><span class="err">role</span><span class="s2">": "</span><span class="err">assistant</span><span class="s2">",
        "</span><span class="err">content</span><span class="s2">": "",
        "</span><span class="err">tool_calls</span><span class="s2">": [ #&lt;-------------- tool_call format에 맞춰서 response
          {
            "</span><span class="err">type</span><span class="s2">": "</span><span class="err">function</span><span class="s2">",
            "</span><span class="err">id</span><span class="s2">": "</span><span class="mi">570498487</span><span class="s2">",
            "</span><span class="err">function</span><span class="s2">": {
              "</span><span class="err">name</span><span class="s2">": "</span><span class="err">multiply</span><span class="s2">",
              "</span><span class="err">arguments</span><span class="s2">": "</span><span class="p">{</span><span class="err">\</span><span class="s2">"a</span><span class="se">\"</span><span class="s2">:1,</span><span class="se">\"</span><span class="s2">b</span><span class="se">\"</span><span class="s2">:2}"</span><span class="w">
            </span><span class="p">}</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">]</span><span class="w">
      </span><span class="p">}</span><span class="err">,</span><span class="w">
      </span><span class="nl">"logprobs"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="err">,</span><span class="w">
      </span><span class="nl">"finish_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tool_calls"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="err">,</span><span class="w">
  </span><span class="nl">"usage"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"prompt_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">285</span><span class="p">,</span><span class="w">
    </span><span class="nl">"completion_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">17</span><span class="p">,</span><span class="w">
    </span><span class="nl">"total_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">302</span><span class="w">
  </span><span class="p">}</span><span class="err">,</span><span class="w">
  </span><span class="nl">"stats"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="err">,</span><span class="w">
  </span><span class="nl">"system_fingerprint"</span><span class="p">:</span><span class="w"> </span><span class="s2">"mistralai/ministral-3-14b-reasoning"</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="err">#</span><span class="w"> </span><span class="err">langgraph</span><span class="w"> </span><span class="err">multiply</span><span class="w"> </span><span class="err">tool의</span><span class="w"> </span><span class="err">결과값을</span><span class="w"> </span><span class="err">다시</span><span class="w"> </span><span class="err">llm으로</span><span class="w"> </span><span class="err">post</span><span class="w">
</span><span class="err">#</span><span class="w"> </span><span class="err">function과</span><span class="w"> </span><span class="err">그</span><span class="w"> </span><span class="err">결과값을</span><span class="w"> </span><span class="err">돌려줌</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="p">[</span><span class="err">DEBUG</span><span class="p">]</span><span class="w">
 </span><span class="err">Received</span><span class="w"> </span><span class="err">request:</span><span class="w"> </span><span class="err">POST</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">/v</span><span class="mi">1</span><span class="err">/chat/completions</span><span class="w"> </span><span class="err">with</span><span class="w"> </span><span class="err">body</span><span class="w">  </span><span class="p">{</span><span class="w">
  </span><span class="nl">"messages"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"You are a helpful assistant"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"system"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1*2"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"user"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"tool_calls"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"570498487"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"multiply"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{</span><span class="se">\"</span><span class="s2">a</span><span class="se">\"</span><span class="s2">: 1, </span><span class="se">\"</span><span class="s2">b</span><span class="se">\"</span><span class="s2">: 2}"</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tool"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"tool_call_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"570498487"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"mistralai/ministral-3-14b-reasoning"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"stream"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
  </span><span class="nl">"temperature"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
  </span><span class="nl">"tools"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"add"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Adds `a` and `b`.</span><span class="se">\n\n</span><span class="s2">    Args:</span><span class="se">\n</span><span class="s2">        a: First int</span><span class="se">\n</span><span class="s2">        b: Second int"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"a"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"b"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">}</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"a"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"b"</span><span class="w">
          </span><span class="p">],</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"multiply"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Multiply `a` and `b`.</span><span class="se">\n\n</span><span class="s2">    Args:</span><span class="se">\n</span><span class="s2">        a: First int</span><span class="se">\n</span><span class="s2">        b: Second int"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"a"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"b"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">}</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"a"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"b"</span><span class="w">
          </span><span class="p">],</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"divide"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Divide `a` and `b`.</span><span class="se">\n\n</span><span class="s2">    Args:</span><span class="se">\n</span><span class="s2">        a: First int</span><span class="se">\n</span><span class="s2">        b: Second int"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"a"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"b"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integer"</span><span class="w">
            </span><span class="p">}</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"a"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"b"</span><span class="w">
          </span><span class="p">],</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="err">#</span><span class="w"> </span><span class="err">llm</span><span class="w"> </span><span class="err">모델의</span><span class="w"> </span><span class="err">최종</span><span class="w"> </span><span class="err">response</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">18</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Running</span><span class="w"> </span><span class="err">chat</span><span class="w"> </span><span class="err">completion</span><span class="w"> </span><span class="err">on</span><span class="w"> </span><span class="err">conversation</span><span class="w"> </span><span class="err">with</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="err">messages.</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">18</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Accumulated</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="err">tokens</span><span class="w">  </span><span class="err">The</span><span class="w">
</span><span class="err">...</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">19</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Accumulated</span><span class="w"> </span><span class="mi">14</span><span class="w"> </span><span class="err">tokens</span><span class="w">  </span><span class="err">The</span><span class="w"> </span><span class="err">result</span><span class="w"> </span><span class="err">of</span><span class="w"> </span><span class="err">\(</span><span class="mi">1</span><span class="w"> </span><span class="err">\times</span><span class="w"> </span><span class="mi">2</span><span class="err">\)</span><span class="w"> </span><span class="err">is</span><span class="w"> </span><span class="err">**</span><span class="mi">2</span><span class="err">**.</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">19</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Model</span><span class="w"> </span><span class="err">generated</span><span class="w"> </span><span class="err">tool</span><span class="w"> </span><span class="err">calls:</span><span class="w">  </span><span class="p">[]</span><span class="w">
</span><span class="mi">2026-02-08</span><span class="w"> </span><span class="mi">01</span><span class="err">:</span><span class="mi">13</span><span class="err">:</span><span class="mi">19</span><span class="w">  </span><span class="p">[</span><span class="err">INFO</span><span class="p">]</span><span class="w">
 </span><span class="p">[</span><span class="err">mistralai/ministral</span><span class="mi">-3-14</span><span class="err">b-reasoning</span><span class="p">]</span><span class="w"> </span><span class="err">Generated</span><span class="w"> </span><span class="err">prediction:</span><span class="w">  </span><span class="p">{</span><span class="w">
  </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"chatcmpl-2ojj2bd99jrvma2y5bngh"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"object"</span><span class="p">:</span><span class="w"> </span><span class="s2">"chat.completion"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"created"</span><span class="p">:</span><span class="w"> </span><span class="mi">1770480798</span><span class="p">,</span><span class="w">
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"mistralai/ministral-3-14b-reasoning"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"choices"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"index"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
      </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"The result of </span><span class="se">\\</span><span class="s2">(1 </span><span class="se">\\</span><span class="s2">times 2</span><span class="se">\\</span><span class="s2">) is **2**."</span><span class="p">,</span><span class="w">
        </span><span class="nl">"tool_calls"</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"logprobs"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w">
      </span><span class="nl">"finish_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"usage"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"prompt_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">305</span><span class="p">,</span><span class="w">
    </span><span class="nl">"completion_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">15</span><span class="p">,</span><span class="w">
    </span><span class="nl">"total_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">320</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"stats"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
  </span><span class="nl">"system_fingerprint"</span><span class="p">:</span><span class="w"> </span><span class="s2">"mistralai/ministral-3-14b-reasoning"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>reference</p>
<ul>
  <li>https://docs.langchain.com/oss/python/langgraph/quickstart</li>
  <li>https://medium.com/ai-agents/langgraph-for-beginners-part-3-conditional-edges-16a3aaad9f31</li>
  <li>https://github.com/teddylee777/LangGraph-Advanced-Tutorial/tree/main</li>
  <li>https://langchain-ai.github.io/langgraph/tutorials/web-navigation/web_voyager/#agent-definition</li>
  <li>https://github.com/spmallick/learnopencv/blob/master/LangGraph-A-Visual-Automation-and-Summarization-Pipeline/browser_automation.py</li>
  <li>https://docs.mistral.ai/cookbooks/concept-deep-dive-tokenization-tool_calling</li>
</ul>]]></content><author><name></name></author><category term="langgraph" /><summary type="html"><![CDATA[LangGraph 2가지 사용법 graph api: state, nodes and edges functional api: persistence, memory, human-in-the-loop, and streaming 대개 graph api 사용함. functional api는 이미 다른 코드가 있고, 거기에 langgraph 접붙일 때, 코드 수정 최소화를 위해 사용]]></summary></entry></feed>