dsh-routing-suite 소개
코딩 에이전트를 오래 쓰다 보면 같은 모델이 날마다 다르게 움직이는 것처럼 느껴질 때가 있습니다. 어떤 세션에서는 첫 턴에 설계를 길게 늘어놓고 파일은 한참 뒤에야 건드리고, 어떤 세션에서는 곧바로 파일을 열어 고치기 시작합니다. 사용자 입장에서는 같은 모델에 비슷한 요청을 넣었을 뿐인데 작업 방식이 달라지니, 원인을 프롬프트에서 찾아야 할지 모델의 컨디션 탓으로 넘겨야 할지 판단하기 어렵습니다. 이 차이를 재현 가능한 조건으로 묶어 두지 못하면, 매번 다른 결과를 받고도 무엇을 바꿔야 할지 알 수 없습니다.
이번에 소개할 dsh-routing-suite는 DeepSeek Harness (
DeepSeek Harness: 에이전트 루프까지 설정으로 교체하는 플러그인 구조의 코딩 에이전트)에서 이 차이를 프리셋 선택 이라는 명시적인 스위치로 바꾸는 저장소입니다. 저자는 첫 요청에 실리는 시스템 프롬프트의 페르소나(Persona) 한 문장이 모델의 작업 궤적을 좌우한다고 보고, 그 한 문장을 세션 시작 시점에 갈아 끼우는 프리셋을 만들었습니다. 프리셋을 고르는 일은 사람이 하고, 고른 뒤에는 라우터가 첫 요청에서만 개입한 다음 손을 뗍니다. 저자가 공개한 실험 문서에 따르면 모델이 세션 도중 스스로 모드를 바꾸는 경로는 거의 열려 있지 않아서, 선택은 바깥에서 들어와야 한다는 것이 이 설계의 출발점입니다.
dsh-routing-suite는 직접 코드를 담고 있지 않고 두 개의 서브모듈을 묶어 설치 절차만 정리한 저장소입니다. 하나는 실행 중인 DSH에 플러그인을 재시작 없이 주입하는 dsh-super-injector이고, 다른 하나는 라우팅 프리셋 본체인 dsh-router-standard입니다. 두 구성 요소는 각자의 저장소에서 따로 버전을 올리고, 이 키트는 둘을 한 번에 받아 순서대로 설치하는 역할을 맡습니다. 저장소의 README.md는 중국어로 쓰여 있고 영문판인 README.en.md가 함께 제공되므로, 이 글은 영문 문서를 기준으로 정리했습니다.
dsh-routing-suite가 다루는 문제: 페르소나 한 문장이 만드는 차이
저자가 근거로 드는 것은 같은 모델을 서로 다른 조건에서 돌린 두 벤치마크입니다. 유지보수 성격의 과제(Project2)에서는 설계 지향 조건이 99/96점과 98/99점을 받은 반면 반대 조건은 91점에 그쳤고, 새로 만드는 성격의 과제(Mario)에서는 실행 지향 조건이 10/10점을 받은 반면 반대 조건은 6점에 그쳤습니다. 이 수치는 저자가 xiaobright/modeltest의 평가 데이터를 인용해 공개한 값이며, 모델을 바꾸지 않고 프롬프트 조건만 바꾼 결과라는 점이 요지입니다.
같은 문서는 페르소나를 연속적으로 조절할 수 있는 손잡이로 보지 않습니다. DeepSeek V4 Pro를 대상으로 모드 값 21개 지점을 공식 API에서 reasoning_effort=max 로 2회씩 측정한 결과, 행동이 세 구간으로 뭉쳐서 나타났다고 정리하고 있습니다:
| 구간 | 모드 값 | 측정된 행동 |
|---|---|---|
spec |
0 – 0.19 | 계획을 함께 세우는 서술이 안정적으로 유지됨 |
mixed |
0.2 – 0.49 | 전환 함정. 서술 방식이 불안정하게 섞임 |
react |
0.5 – 1.0 | 실행자 서술이 안정적으로 유지되며, 11개 모드 값이 비슷하게 동작 |
위 표에서 눈에 띄는 것은 가운데 구간입니다. 저자는 이 구간을 학습 분포에서 벗어난 영역으로 보고, 숫자 입력을 받는 dev_router_mode 인터페이스는 남겨 두되 자동 선택에서는 이 구간을 제외했다고 밝히고 있습니다. DeepSeek V4 Flash는 다른 모양을 보여서, 0에서 0.5까지가 모두 설계 쪽으로 분류되다가 0.75 이상에서 갑자기 바뀌는 문턱형으로 정리돼 있습니다.
다만 한 가지 함께 읽어야 할 것이 있습니다. dsh-router-standard 저장소의 README 맨 위에는 저자가 직접 올린 정정문이 실려 있는데, 논문의 측정 결과는 유지하되 이론적 해석 부분을 무효로 표시한다 는 내용입니다. 두 종류의 안정 상태가 있다는 가설과 모델이 스스로 라우팅할 수 없다는 강한 단정이 그 대상으로 지목돼 있고, 자세한 내용은 저장소의 docs/statement.md에 정리돼 있습니다. 프리셋을 실제로 쓸지 판단할 때는 측정치와 해석을 나눠서 보는 편이 안전합니다.
dsh-routing-suite가 제공하는 두 라우팅 프리셋
두 프리셋은 첫 요청을 어떻게 구성하느냐에서 갈립니다. router-standard는 첫 요청의 시스템 프롬프트에서 정체성, 웹, 도구 안내 섹션을 걷어내고 강화학습(Reinforcement Learning, RL) 단계에서 쓰인 문장 하나만 남긴 다음, 셸과 str_replace_editor 두 도구만 노출합니다. router-spec은 세션의 첫 사용자 메시지를 읽어 작업을 분류하고, 분류 결과에 맞는 페르소나와 첫 턴 도구 집합을 주입합니다.
그리고 첫 도구 호출이 지나가면 두 프리셋 모두 전체 도구 목록을 열어 주고 라우터는 더 이상 개입하지 않습니다. 모드는 세션 이벤트에서 파생되므로 세션을 다시 열어도 유지되고, 계획 모드용 프롬프트 섹션도 그대로 남습니다. 라우팅 상태를 확인하거나 손으로 바꿀 때 쓰는 도구는 세 가지입니다:
dev_router_status: 현재 모드, 구간, 페르소나, 핵심 도구, 수동 지정 여부를 보여줍니다.dev_router_mode <spec|weak|mixed|react|0-100|0.0-1.0|auto>: 모드를 직접 지정합니다. 숫자를 넣으면 앞서 본 세 구간 중 하나로 맞춰집니다.dev_mode_subagent <spec|react|balanced> <task>: 지금 세션을 건드리지 않고, 격리된 컨텍스트에서 다른 모드로 작업 하나를 돌립니다.
이 가운데 세 번째 도구가 있는 이유는 세션 중간에 페르소나를 바꾸는 방법이 마땅치 않기 때문입니다. 저자는 중간에 페르소나를 교체하면 프롬프트 앞부분의 캐시가 통째로 무효가 되고, 대화 끝에 페르소나를 덧붙이는 방식은 효과가 없었다고 적고 있습니다. 그래서 다른 모드가 필요하면 세션을 바꾸는 대신 격리된 컨텍스트를 따로 띄우는 쪽을 택했습니다.
프리셋은 모델에 따라 다른 페르소나를 자동으로 고릅니다. 저자가 공개한 값으로는 V4 Pro에서 24회 중 24회 의도한 모드로 라우팅됐고, V4 Flash에서는 96%가 라우팅되고 단일 작업 완료율이 100%로 나왔습니다. 매 메시지에 함께 들어가는 안내 문구도 작업 복잡도에 따라 갈라져서, 단순한 작업에는 빨리 수렴하도록 유도하고 복잡한 작업에는 아키텍처와 경계 조건, 통합 지점을 깊게 생각하되 환경이나 도구에는 추론(reasoning)을 쓰지 말라 는 취지의 안내를 넣습니다. 저자는 이 안내를 넣었을 때 사고 깊이가 12% 늘면서도 수렴이 빨라졌고(8.0단계 대 8.3단계), 되새김에 쓰이는 추론 토큰 비중이 0.0~0.3%로 측정됐다고 밝히고 있습니다.
dsh-routing-suite 설치하기
설치는 서브모듈까지 함께 받은 뒤 스크립트 한 번을 실행하는 순서입니다. 저장소가 안내하는 명령은 PowerShell 기준입니다:
# 1. 서브모듈을 포함해 저장소를 받습니다
git clone --recurse-submodules https://github.com/yjh051108/dsh-routing-suite.git
cd dsh-routing-suite
# 2. 주입기 장착과 프리셋 복사를 한 번에 처리합니다
.\install.ps1
스크립트를 쓰지 않고 직접 하려면 주입기를 공식 경로로 장착한 뒤 원하는 프리셋 디렉토리를 사용자 프로필 아래로 복사하면 됩니다:
# 주입기 장착 (재시작 후에는 bundles가 넘겨받습니다)
dsh plugin --profile web add .\injector
# 프리셋 설치 (둘 중 하나 또는 둘 다)
$target = Join-Path $env:USERPROFILE '.dsh\.agent-presets\router-standard'
Copy-Item -Recurse .\preset\preset\router-standard $target
$target = Join-Path $env:USERPROFILE '.dsh\.agent-presets\router-spec'
Copy-Item -Recurse .\preset\preset\router-spec $target
설치가 끝나면 DSH를 재시작하고 새 세션에서 Router Standard (experimental) 또는 Router Spec (experimental) 을 고릅니다. 라우팅 로직 자체는 외부 의존성 없는 파일 하나로 분리돼 있어서 node --test router.test.mjs 로 분류와 구간, 페르소나, 계획 섹션 유지 여부를 확인하는 단위 테스트 11개가 함께 들어 있습니다.
dsh-routing-suite는 누구에게 유용한가
DeepSeek Harness를 이미 쓰고 있고 같은 작업을 반복하면서 결과 편차가 신경 쓰였다면, 프리셋을 바꿔 가며 차이를 확인해 볼 값어치가 있습니다. 반대로 DSH를 쓰지 않는 환경이라면 프리셋 파일과 라우팅 로직이 DSH의 프리셋 구조에 맞춰져 있어 그대로 옮겨 쓰기 어렵습니다. 설치 안내가 PowerShell로만 적혀 있어 macOS나 리눅스에서는 경로와 명령을 직접 옮겨야 하고, 프리셋 이름에 붙은 experimental 표시와 저자가 올린 정정문을 함께 보면 아직 실험 단계로 다루는 편이 맞습니다. 저장소가 공개한 수치는 모두 저자가 자체 측정해 공개한 값이므로, 도입을 검토한다면 본인 작업 흐름에서 같은 비교를 한 번 돌려 보는 편이 확실합니다.
dsh-routing-suite의 라이선스
dsh-routing-suite 저장소에는 LICENSE 파일이 없고 README 하단에 MIT라고 적혀 있습니다. 프리셋 본체인 dsh-router-standard에는 MIT 라이선스 파일이 들어 있고, 프리셋 구성 파일이 DeepSeek Harness의 Standard 프리셋에서 파생된 부분의 출처는 같은 저장소의 NOTICE에 적혀 있습니다.
첫 턴 고정 방식은 xiaobright/dsh-anchored-standard의 도구 부트스트랩 메커니즘을 플러그인 수준으로 옮긴 것이라고 밝히고 있으므로, 상업적 사용 전에는 구성 요소별 라이선스를 각각 확인하는 편이 안전합니다.
dsh-router-standard의 실험 문서
dsh-routing-suite 프로젝트 GitHub 저장소
dsh-router-standard 라우팅 프리셋 저장소
dsh-super-injector 런타임 주입기 저장소
더 읽어보기
-
awesome-dsh-plugin: 실제로 동작하는 DeepSeek Harness 플러그인들을 모아둔 저장소 (≠ 큐레이션 저장소)
-
DSH Desktop: Node.js 설치 없이 DeepSeek Harness를 실행하는 데스크탑 애플리케이션
-
DeepSeek-V4-Flash 정식 버전 출시, 성능은 좋아지면서 가격은 낮아진 모델 (Task당 약 $0.027)
-
Artificial Analysis가 공개한 코딩 에이전트 벤치마크: 모델 + 하네스의 조합으로 평가한 벤치마크 결과
이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. ![]()
이 도구를 직접 설치해 사용해보셨다면, 파이토치 한국 사용자 모임
회원들을 위해 경험이나 팁을 댓글로 남겨주세요! ![]()

