<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: June7th</title>
    <description>The latest articles on DEV Community by June7th (@jaytoone).</description>
    <link>https://dev.to/jaytoone</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3759259%2F1efb7f5f-f815-4f09-8e95-36ec809b80fc.png</url>
      <title>DEV Community: June7th</title>
      <link>https://dev.to/jaytoone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaytoone"/>
    <language>en</language>
    <item>
      <title>CTX: I built a LLM-free code context loader that uses 5.2% of tokens</title>
      <dc:creator>June7th</dc:creator>
      <pubDate>Tue, 31 Mar 2026 06:42:29 +0000</pubDate>
      <link>https://dev.to/jaytoone/ctx-i-built-a-llm-free-code-context-loader-that-uses-52-of-tokens-35kd</link>
      <guid>https://dev.to/jaytoone/ctx-i-built-a-llm-free-code-context-loader-that-uses-52-of-tokens-35kd</guid>
      <description>&lt;h1&gt;
  
  
  CTX: LLM-free Code Context Loader
&lt;/h1&gt;

&lt;p&gt;Every AI coding agent faces the same problem: &lt;strong&gt;what context to include in the prompt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Naive approach: dump the whole codebase → 100% of token budget gone.&lt;br&gt;
Smart approach: use BM25 search → misses dependency files, import chains, recent edits.&lt;/p&gt;

&lt;p&gt;I built CTX to solve this with a deterministic, zero-LLM approach.&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;CTX classifies every query into one of 4 trigger types and routes it to the right retrieval strategy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CTXRetriever&lt;/span&gt;

&lt;span class="n"&gt;retriever&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CTXRetriever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retriever&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Where is AuthMiddleware defined?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → Trigger: EXPLICIT_SYMBOL → symbol index lookup → returns 2 files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Trigger types:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;EXPLICIT_SYMBOL&lt;/code&gt; → exact symbol lookup in structural index&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SEMANTIC_CONCEPT&lt;/code&gt; → BM25 hybrid blend&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TEMPORAL_HISTORY&lt;/code&gt; → git log + recently modified files&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IMPLICIT_CONTEXT&lt;/code&gt; → import graph traversal (finds what the target imports)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benchmark Results
&lt;/h2&gt;

&lt;p&gt;87 queries, 29 docs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;CTX&lt;/th&gt;
&lt;th&gt;BM25&lt;/th&gt;
&lt;th&gt;Dense TF-IDF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R@3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.862&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.667&lt;/td&gt;
&lt;td&gt;0.690&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R@5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.954&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.839&lt;/td&gt;
&lt;td&gt;0.805&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.795&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.611&lt;/td&gt;
&lt;td&gt;0.563&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token usage&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For dependency queries specifically: R@5 = &lt;strong&gt;1.000&lt;/strong&gt; (BM25 = 0.400).&lt;/p&gt;

&lt;h2&gt;
  
  
  COIR Benchmark (CodeSearchNet Python)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;CTX&lt;/th&gt;
&lt;th&gt;BM25&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R@1&lt;/td&gt;
&lt;td&gt;0.720&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R@5&lt;/td&gt;
&lt;td&gt;0.740&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;0.728&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;ctx-retriever
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/jaytoone/CTX" rel="noopener noreferrer"&gt;jaytoone/CTX&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The key insight: &lt;strong&gt;query intent classification before retrieval beats generic search for code context loading&lt;/strong&gt;. The trigger classifier adds ~0ms overhead (pure regex + structural index).&lt;/p&gt;

&lt;p&gt;Would love feedback from anyone building RAG pipelines for code.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>NIPA 플랫폼에서 AI 코딩 비용 38% 줄이기 - 실전 프록시 설정</title>
      <dc:creator>June7th</dc:creator>
      <pubDate>Sun, 08 Feb 2026 00:47:25 +0000</pubDate>
      <link>https://dev.to/jaytoone/nipa-peulraespomeseo-ai-koding-biyong-38-juligi-siljeon-peurogsi-seoljeong-fm0</link>
      <guid>https://dev.to/jaytoone/nipa-peulraespomeseo-ai-koding-biyong-38-juligi-siljeon-peurogsi-seoljeong-fm0</guid>
      <description>&lt;h2&gt;
  
  
  들어가며
&lt;/h2&gt;

&lt;p&gt;3개월 전, 한국 정부에서 운영하는 AI 개발자 플랫폼 &lt;strong&gt;NIPA&lt;/strong&gt;를 알게 되었습니다. 무료로 제공하는 &lt;strong&gt;Kimi K2.5&lt;/strong&gt; 모델(256K 컨텍스트, 1T MoE)이 매력적이어서 바로 OpenCode와 연동해서 사용하기 시작했습니다.&lt;/p&gt;

&lt;p&gt;처음에는 "무료니까 무제한으로 쓸 수 있겠지"라고 생각했지만, 현실은 달랐습니다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;한 달 토큰 비용: &lt;strong&gt;$180&lt;/strong&gt; (약 24만원)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;무료 플랫폼이지만 토큰 사용량에 따라 비용이 청구되는 구조였고, 긴 컨텍스트를 유지하다 보니 비용이 기하급수적으로 늘어났습니다.&lt;/p&gt;

&lt;p&gt;이 글에서는 NIPA 플랫폼에서 OpenCode를 사용하며 토큰 비용을 &lt;strong&gt;38% 절감&lt;/strong&gt;한 실전 경험을 공유합니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  문제 상황
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Kimi K2.5의 매력과 함정
&lt;/h3&gt;

&lt;p&gt;Kimi K2.5는 다음과 같은 강점을 가지고 있습니다:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;256K 컨텍스트 윈도우&lt;/strong&gt;: 대규모 코드베이스 분석 가능&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1T MoE 파라미터&lt;/strong&gt;: GPT-4급 성능&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;한국어 지원&lt;/strong&gt;: 영어 모델보다 한국어 성능 우수&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;하지만 이런 강점이 비용 폭탄으로 돌아왔습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenCode 기본 설정의 한계
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compaction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;기본값:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="err"&gt;%에서&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;compaction&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenCode의 기본 compaction은 &lt;strong&gt;75% threshold&lt;/strong&gt;에서 동작합니다. 이는 이미 비용이 많이 발생한 후에야 compaction이 일어난다는 의미입니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;실제 측정 결과&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;평균 세션당 토큰: &lt;strong&gt;450,000&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;월간 비용: &lt;strong&gt;$180&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Compaction 타이밍: 너무 늦음&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  해결책: 커스텀 프록시 + 선제적 Compaction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  아키텍처 설계
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                        OpenCode                              │
│  - baseURL: localhost:10347 (프록시)                        │
│  - includeUsage: true                                       │
└───────────────────────┬─────────────────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────────────────┐
│              nipa-token-monitor (localhost:10347)            │
│  1. API 요청을 NIPA 서버로 전달                              │
│  2. SSE 응답에서 prompt_tokens 추출                         │
│  3. nipa-usage.json에 실시간 기록                           │
└───────────────────────┬─────────────────────────────────────┘
                        │
        ┌───────────────┴───────────────┐
        │                               │
        ▼                               ▼
┌──────────────────┐          ┌──────────────────┐
│  NIPA API Server │          │ nipa-usage.json  │
│  (Kimi K2.5)     │          │ (토큰 브릿지)     │
└──────────┬───────┘          └────────┬─────────┘
           │                           │
           ▼                           ▼
┌──────────────────┐          ┌──────────────────────────┐
│   응답 스트림     │          │ glm-preemptive-compaction│
│   (SSE)          │          │ (70%에서 compaction)    │
└──────────────────┘          └──────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  핵심: 파일 브릿지 패턴
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;nipa-token-monitor&lt;/strong&gt;가 SSE(Server-Sent Events) 응답에서 실제 API 토큰 수를 추출하여 &lt;code&gt;nipa-usage.json&lt;/code&gt; 파일에 기록합니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;glm-preemptive-compaction&lt;/strong&gt; 플러그인은 이 파일을 주기적으로 읽어 70% threshold를 체크하고, 도달 시 compaction을 실행합니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  구현 상세
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. nipa-token-monitor (프록시 서버)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;핵심 기능&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SSE 투명 전달&lt;/strong&gt;: 스트리밍을 끊지 않고 그대로 전달&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;usage 추출&lt;/strong&gt;: SSE 마지막 청크에서 &lt;code&gt;prompt_tokens&lt;/code&gt; 추출&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;파일 브릿지&lt;/strong&gt;: JSON 파일로 토큰 데이터 실시간 공유
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 핵심 로직: SSE에서 usage 추출&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;extractUsageFromSSE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sseBuffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sseBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;lastUsage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[DONE]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;lastUsage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;lastUsage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;설정값&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CONFIG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;PROXY_PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10347&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;TARGET_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proxy2.nipa2025.ktcloud.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;TARGET_PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10261&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;CONTEXT_LIMIT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;262144&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 256K&lt;/span&gt;
  &lt;span class="na"&gt;THRESHOLD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;          &lt;span class="c1"&gt;// 80% 알림&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. OpenCode 설정
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;opencode.json&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://opencode.ai/config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nipa-kimi-k25"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@ai-sdk/openai-compatible"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NIPA Kimi-K2.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"baseURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:10347/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"includeUsage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Kimi-K2.5"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kimi-K2.5 (256K Context)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nipa-kimi-k25/Kimi-K2.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compaction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;커스텀&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;compaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;사용&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"oh-my-opencode"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;oh-my-opencode.json&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"experimental"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"preemptive_compaction_threshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"compaction_timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aggressive_truncation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dcp_for_compaction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"auto_resume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 실시간 토큰 데이터
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;nipa-usage.json&lt;/strong&gt; (자동 생성):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-02-08T00:25:42.588Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;164081&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;164181&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"context_limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;262144&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage_percentage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.626&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;963&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  성과
&lt;/h2&gt;

&lt;h3&gt;
  
  
  비용 절감
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;개선률&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;평균 토큰/세션&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;450,000&lt;/td&gt;
&lt;td&gt;280,000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38% 감소&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;월간 비용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$180&lt;/td&gt;
&lt;td&gt;$112&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38% 절감&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compaction 타이밍&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;75% (늦음)&lt;/td&gt;
&lt;td&gt;70% (선제적)&lt;/td&gt;
&lt;td&gt;최적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스트리밍&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;끊김 현상&lt;/td&gt;
&lt;td&gt;원활&lt;/td&gt;
&lt;td&gt;유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  기술적 성과
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;이전&lt;/th&gt;
&lt;th&gt;현재&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;토큰 추정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;문자 수 기반 (부정확)&lt;/td&gt;
&lt;td&gt;API 실제 값 (100% 정확)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스트리밍&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;stream=false&lt;/code&gt; 강제&lt;/td&gt;
&lt;td&gt;SSE 투명 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;반복 작업&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;td&gt;5% 이하 (System Prompt Injection)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  설치 및 사용 방법
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 레포지토리 클론
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/jaytoone/nipa-opencode-proxy.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nipa-opencode-proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 설정 파일 복사
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# OpenCode 설정&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;config/opencode.json.example ~/.config/opencode/opencode.json

&lt;span class="c"&gt;# oh-my-opencode 설정&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;config/oh-my-opencode.json.example ~/.config/opencode/oh-my-opencode.json

&lt;span class="c"&gt;# 모델 설정&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;config/nipa-model-config.json.example ~/.config/opencode/nipa-model-config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 프록시 실행
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;tools
node nipa-token-monitor.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. OpenCode 재시작
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. 토큰 모니터링
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 실시간 토큰 확인&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.config/opencode/logs/nipa-usage.json

&lt;span class="c"&gt;# 로그 확인&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.config/opencode/logs/nipa-token-monitor.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  트러블슈팅
&lt;/h2&gt;

&lt;h3&gt;
  
  
  토큰 추적이 안 될 때
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. includeUsage 설정 확인&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"includeUsage"&lt;/span&gt; ~/.config/opencode/opencode.json
&lt;span class="c"&gt;# → true 여야 함&lt;/span&gt;

&lt;span class="c"&gt;# 2. 프록시 로그 확인&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; ~/.config/opencode/logs/nipa-token-monitor.log | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"usage"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compaction이 안 될 때
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. threshold 설정 확인&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"preemptive_compaction_threshold"&lt;/span&gt; ~/.config/opencode/oh-my-opencode.json

&lt;span class="c"&gt;# 2. 플러그인 로그 확인&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; ~/.config/opencode/logs/glm-preemptive-compaction.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  오픈소스로 공개
&lt;/h2&gt;

&lt;p&gt;이 프로젝트를 GitHub에 오픈소스로 공개했습니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/jaytoone/nipa-opencode-proxy" rel="noopener noreferrer"&gt;github.com/jaytoone/nipa-opencode-proxy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;포함 내용&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ 실제 동작하는 설정 파일&lt;/li&gt;
&lt;li&gt;✅ nipa-token-monitor.js (프록시 서버)&lt;/li&gt;
&lt;li&gt;✅ 상세 문서 및 설치 가이드&lt;/li&gt;
&lt;li&gt;✅ 트러블슈팅 가이드&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;기여 환영&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;버그 리포트&lt;/li&gt;
&lt;li&gt;기능 제안&lt;/li&gt;
&lt;li&gt;PR (Pull Request)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  배운 점
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. SSE 스트리밍 처리
&lt;/h3&gt;

&lt;p&gt;OpenAI-compatible API의 SSE 응답은 마지막 청크에 &lt;code&gt;usage&lt;/code&gt; 정보를 포함합니다. 이를 추출하기 위해 스트림을 끊지 않고 투명하게 전달하는 것이 핵심이었습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 파일 브릿지 패턴
&lt;/h3&gt;

&lt;p&gt;프로세스 간 통신(IPC) 대신 단순한 JSON 파일을 사용했습니다. 이는 디버깅이 쉽고, 로그 기록이 자동으로 남는다는 장점이 있습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 선제적 Compaction
&lt;/h3&gt;

&lt;p&gt;75%에서 compaction하는 것보다 70%에서 하는 것이 비용적으로 훨씬 효율적입니다. "나중에 하자"는 생각이 오히려 비용을 키웁니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  마무리
&lt;/h2&gt;

&lt;p&gt;NIPA 플랫폼은 한국 개발자에게 매력적인 AI 인프라를 제공합니다. 하지만 토큰 비용을 효율적으로 관리하지 않으면 예상보다 많은 비용이 발생할 수 있습니다.&lt;/p&gt;

&lt;p&gt;이 글에서 소개한 프록시 설정으로 저는 월 $68(약 9만원)을 절감했습니다. 비용 절감뿐만 아니라, 스트리밍 품질 개선과 반복 작업 감소라는 보너스도 얻었습니다.&lt;/p&gt;

&lt;p&gt;같은 문제를 겪고 계신 분들께 도움이 되길 바랍니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;질문이나 피드백은 댓글로 남겨주세요!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  참고 자료
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nipa.kr" rel="noopener noreferrer"&gt;NIPA AI Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jaytoone/nipa-opencode-proxy" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.moonshot.cn/" rel="noopener noreferrer"&gt;Kimi K2.5 Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;이 글은 실제 프로덕션 환경에서 사용 중인 설정을 바탕으로 작성되었습니다.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
