giip
SES Proposal
5 min read

์—์ด์ „ํŠธ ๋“ฑ๋ก ๋ฐ ํ API ๋ช…์„ธ

์ด ๋ฌธ์„œ๋Š” AI ์—์ด์ „ํŠธ(๋˜๋Š” ์ž„์˜์˜ ํ˜ธ์ŠคํŠธ)๋ฅผ GIIP ๋…ผ๋ฆฌ ๋จธ์‹ ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , ์ž์‹ ์˜ CQE ํƒœ์Šคํฌ ํ๋ฅผ ํด๋งํ•˜๋ฉฐ, ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๊ธฐ์ˆ  ๋ช…์„ธ๋‹ค โ€” ํ”„๋กœ๋•์…˜์˜ giipAgentWin/giipAgentLinux๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

๐Ÿ”Œ giip-agent ์Šคํ‚ฌ ๋ฒˆ๋“ค๋กœ ์ด๋™ โ†’

๐Ÿ“‹ ๊ฐœ์š”

์ด API๋Š” ํ˜ธ์ŠคํŠธ โ€” giipAgentWin/giipAgentLinux๋ฅผ ์‹คํ–‰ ์ค‘์ธ ๋ฌผ๋ฆฌ/๊ฐ€์ƒ ๋จธ์‹ , ๋˜๋Š” ์ž์ฒด ํ•˜๋“œ์›จ์–ด ์ •์ฒด์„ฑ์ด ์—†๋Š” AI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ์„ธ์…˜ โ€” ๊ฐ€ ์ž์‹ ์„ tLSvr์— ๋…ผ๋ฆฌ ๋จธ์‹ (lssn)์œผ๋กœ ๋“ฑ๋กํ•œ ๋’ค, ๊ทธ lssn์˜ CQE(Centralized Queue Engine) ํƒœ์Šคํฌ ํ๋ฅผ ํด๋งํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์„ธ ๋™์ž‘ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•œ๋‹ค.


๐Ÿ” ์ธ์ฆ โ€” REST ๊ณ„์—ด๊ณผ ๋‹ค๋ฅธ ๋‹จ์ผ ๋””์ŠคํŒจ์ฒ˜ ์—”๋“œํฌ์ธํŠธ

์ด์Šˆ ๊ด€๋ฆฌ API์™€ API ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๋‹ค. ๊ทธ์ชฝ์€ x-api-key ํ—ค๋”์™€ ์‹ค์ œ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ์ผ๋ฐ˜ REST ์—”๋“œํฌ์ธํŠธ(/api/giipIssues)๋‹ค. ์ด API๋Š” giipApiSk2 โ€” ํผ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์˜ ๋‹จ์ผ ๋ฒ”์šฉ ๋””์ŠคํŒจ์ฒ˜ ์—”๋“œํฌ์ธํŠธ์ด๋ฉฐ ํ•ญ์ƒ HTTP 200์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฒ ์ด์Šค URL

https://giipfaw.azurewebsites.net/api/giipApiSk2

์š”์ฒญ ํ˜•ํƒœ (ํ•ญ์ƒ ๋™์ผํ•œ 3๊ฐœ ํ•„๋“œ)

ํ•„๋“œ๋‚ด์šฉ
text์Šคํ† ์–ด๋“œ ํ”„๋กœ์‹œ์ € "๋ช…๋ น" ์ด๋ฆ„๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ๋‚˜์—ด(์˜ˆ: AgentAutoRegister hostname jsondata) โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด ์•„๋‹˜
tokenSK, ์ผ๋ฐ˜ ํผ ํ•„๋“œ๋กœ ์ „์†ก. HTTP ํ—ค๋”๊ฐ€ ์•„๋‹ˆ๋‹ค.
jsondata์‹ค์ œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋‹ด์€ JSON ๊ฐ์ฒด
curl -s -X POST "https://giipfaw.azurewebsites.net/api/giipApiSk2" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "text=AgentAutoRegister hostname jsondata" \
  --data-urlencode "token=${GIIP_API_KEY}" \
  --data-urlencode 'jsondata={"hostname":"Lowy-DP01-claude-code","os":"Windows 10"}'

HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค

์ด ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์€ ๋ชจ๋‘ 200 OK๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ž˜๋ชป๋œ SK์— ๋Œ€ํ•œ 401๋„, ์กด์žฌํ•˜์ง€ ์•Š๋Š” lssn์— ๋Œ€ํ•œ 404๋„, ๊ถŒํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ 403๋„ ์—†๋‹ค. ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ JSON ๋ฐ”๋””์˜ data[0].RstVal์— ๋‹ด๊ธด๋‹ค(giipfaw/giipApiSk2/run.ps1 ์†Œ์Šค ๊ฒ€ํ†  ๋ฐ ๋ผ์ด๋ธŒ ํ…Œ์ŠคํŠธ๋กœ ํ™•์ธ, 2026-09-06):

{"data":[{"Proc_MSG":"401|Unauthorized - Invalid SK","RstVal":401,"RstMsg":"Unauthorized - Invalid Secret Key"}]}

์œ„ ์‘๋‹ต๋„ HTTP 200์ด๋‹ค. giipApiSk2 ํ˜ธ์ถœ์˜ ์‹ค์ œ ์„ฑ๊ณต ์—ฌ๋ถ€๋Š” HTTP ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ญ์ƒ data[0].RstVal๋กœ ํŒ๋‹จํ•  ๊ฒƒ.

SK โ€” Issue API์™€ ๊ฐ™์€ ํ‚ค ์ข…๋ฅ˜, ๋‹ค๋ฅธ ์ „์†ก ๋ฐฉ์‹

  • Issue API๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€, /svclist์—์„œ ๋ฐœ๊ธ‰ํ•˜๋Š” csn ๋‹จ์œ„ ํ”„๋กœ์ ํŠธ SK๋‹ค โ€” ๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ๋Š” x-api-key ํ—ค๋”๊ฐ€ ์•„๋‹ˆ๋ผ POST ๋ฐ”๋””์˜ token=<sk>๋กœ ์ „์†กํ•œ๋‹ค.
  • csn์€ SK๋กœ๋ถ€ํ„ฐ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ๋„์ถœ๋œ๋‹ค(dbo.lwGetCSNbysk(@sk)) โ€” ์š”์ฒญ์— csn์„ ์ง์ ‘ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ, AgentAutoRegister/CQEQueueGet์—๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์ •ํ•œ csn์„ ๋ชฐ๋ž˜ ํด๋žจํ”„ํ•  ์—ฌ์ง€ ์ž์ฒด๊ฐ€ ์—†๋‹ค(giipdb/SP/pApiAgentAutoRegisterBySK.sql ๊ฒ€ํ† ๋กœ ํ™•์ธ, 2026-09-06). KVSPut์€ ์ด์™€ ๊ด€๋ จ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ์†Œ์œ ๊ถŒ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค โ€” ์•„๋ž˜ ์ฐธ๊ณ .

์—”๋“œํฌ์ธํŠธ

AgentAutoRegister โ€” ๋…ผ๋ฆฌ ๋จธ์‹  ๋“ฑ๋ก ๋˜๋Š” ๊ธฐ์กด ๋จธ์‹  heartbeat

์š”์ฒญ:

text=AgentAutoRegister hostname jsondata
token=<sk>
jsondata={
  "hostname": "Lowy-DP01-claude-code",
  "os": "Windows 10",
  "cpu": "...", "cpu_cores": 8, "memory_gb": 32, "disk_gb": 512,
  "agent_version": "giip-agent-skill/1.0.0",
  "ipv4_global": "...", "ipv4_local": "...",
  "network": [{"name":"eth0","ipv4":"...","ipv6":"...","mac":"..."}],
  "software": [{"name":"...","version":"...","vendor":"...","type":"..."}],
  "services": [{"name":"...","status":"...","start_type":"...","port":80}]
}

hostname๋งŒ ํ•„์ˆ˜์ด๊ณ  ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” best-effort์ด๋ฉฐ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

์‹๋ณ„ ํ‚ค๋Š” (hostname, csn)์ด๋‹ค. ์Šคํ† ์–ด๋“œ ํ”„๋กœ์‹œ์ €(pApiAgentAutoRegisterBySK)๋Š” LSHostname = hostname AND CSn = <SK๋กœ๋ถ€ํ„ฐ ๋„์ถœ> ์กฐ๊ฑด์œผ๋กœ tLSvr์„ ์กฐํšŒํ•œ๋‹ค:

๊ธฐ์กด ํ–‰ ์กด์žฌ?๋™์ž‘์‘๋‹ต
์—†์Œ์ƒˆ tLSvr ํ–‰ INSERT, lssn = SCOPE_IDENTITY(){"data":[{"lssn":<new>,"action":"new","RstVal":200,...}]}
์žˆ์Œ๊ธฐ์กด ํ–‰ UPDATE(์ŠคํŽ™, ๋„คํŠธ์›Œํฌ/์†Œํ”„ํŠธ์›จ์–ด/์„œ๋น„์Šค ์ธ๋ฒคํ† ๋ฆฌ, LSLastHeartbeat){"data":[{"lssn":<same>,"action":"update","RstVal":200,...}]}

๋ผ์ด๋ธŒ ๊ฒ€์ฆ ์™„๋ฃŒ (2026-09-06, csn 47):

$ python scripts/giip_agent.py register --tool-slug claude-code
{"success": true, "hostname": "Lowy-DP01-claude-code", "lssn": 71290, "action": "new"}
$ python scripts/giip_agent.py register --tool-slug claude-code   # ๋ฐ˜๋ณต ํ˜ธ์ถœ
{"success": true, "hostname": "Lowy-DP01-claude-code", "lssn": 71290, "action": "update"}

ํ•„์ˆ˜ ํ˜ธ์ŠคํŠธ๋ช… ๊ทœ์น™: <๋ฌผ๋ฆฌ ํ˜ธ์ŠคํŠธ๋ช…>-<tool-slug>. ๊ฐ™์€ ํ˜ธ์ŠคํŠธ์˜ ์„œ๋กœ ๋‹ค๋ฅธ AI ๋„๊ตฌ๋Š” ๊ฐ์ž์˜ hostname์œผ๋กœ(๋”ฐ๋ผ์„œ ๊ฐ์ž์˜ lssn์œผ๋กœ) ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค โ€” ๊ฐ™์€ PC์—์„œ ๋Œ์•„๊ฐ€๋Š” Claude Code, Codex, Antigravity๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์„ธ ๋…ผ๋ฆฌ ๋จธ์‹ ์ด๋‹ค(์˜ˆ: Lowy-DP01-claude-code, Lowy-DP01-codex, Lowy-DP01-antigravity). ์ด๋Š” ์„œ๋ฒ„๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ์ œ์•ฝ์ด ์•„๋‹ˆ๋ผ ๋ฌธ์„œ/ํด๋ผ์ด์–ธํŠธ ์ฐจ์›์˜ ๊ทœ์œจ์ด๋‹ค โ€” ์„œ๋ฒ„๋Š” ์–ด๋–ค hostname์„ ๋ณด๋‚ด๋“  ๊ทธ๋Œ€๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ๊ทœ์œจ์€ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

์ž˜๋ชป๋œ SK๋Š” 401์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  data[0] ์•ˆ์— RstVal: 401๋กœ ํ‘œํ˜„๋œ๋‹ค({"Proc_MSG":"401|Unauthorized - Invalid SK",...}).

CQEQueueGet โ€” ์ด lssn์˜ ํ๋ฅผ ํ•œ ๋ฒˆ ํด๋ง

์š”์ฒญ:

text=CQEQueueGet lssn hostname os op
token=<sk>
jsondata={"lssn":71290,"hostname":"Lowy-DP01-claude-code","os":"Windows 10","op":"op"}

์‘๋‹ต, ์ž‘์—… ์žˆ์Œ:

{"data":[{"RstVal":"200","ms_body":"<script or payload text>","mslsn":8032,"script_type":"sh","mssn":123}]}

์‘๋‹ต, ํ ์—†์Œ (๋ผ์ด๋ธŒ ๊ฒ€์ฆ, 2026-09-06) โ€” ์ด๋Š” ์„ฑ๊ณต์ด์ง€ ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋‹ค:

{"data":[{"RstVal":"404","ProcName":"[pCQEQueueGetbySK02] no queue 2"}]}
$ python scripts/giip_agent.py poll --lssn 71290 --tool-slug claude-code
{"success": true, "lssn": 71290, "has_work": false}

RstVal ์˜๋ฏธ (giipdb/SP/pApiCQEQueueGetbySK.sql ๊ฒ€ํ† ๋กœ ํ™•์ธ, 2026-09-06):

RstVal์˜๋ฏธ
200ํ์— ์ž‘์—… ์žˆ์Œ; ms_body/mslsn/mssn/script_type์ด ์ฑ„์›Œ์ง
201์‹ ๊ทœ lssn์— ๋Œ€ํ•œ ์ตœ์ดˆ ํด๋ง์ด ์•”๋ฌต์  ์žฌ๋“ฑ๋ก ๊ฒฝ๋กœ๋ฅผ ์œ ๋ฐœํ•จ โ€” "์•„์ง ์ž‘์—… ์—†์Œ"๊ณผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜๊ณ  ์ž ์‹œ ํ›„ ๋‹ค์‹œ ํด๋ง
0 ๋˜๋Š” 404ํ™•์ธํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ํ๊ฐ€ ์—†์Œ โ€” ์ •์ƒ, ์—๋Ÿฌ ์•„๋‹˜
๊ทธ ์™ธ์‹ค์ œ ์—๋Ÿฌ

๊ถŒ์žฅ ํด๋ง ์ฃผ๊ธฐ: 60์ดˆ. ์‹ค์ œ giipAgentLinux ์„ค์น˜๊ฐ€ cron์œผ๋กœ ์“ฐ๋Š” ์ฃผ๊ธฐ(* * * * *)์™€ ๋™์ผํ•˜๋‹ค. ์ด API ์ž์ฒด๊ฐ€ ํด๋ง์„ ์†๋„ ์ œํ•œํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋” ๋น ๋ฅด๊ฒŒ ํด๋งํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค โ€” ํ๋Š” GIIP ์ž์ฒด ์ผ์ •์— ๋”ฐ๋ผ ์ฑ„์›Œ์ง„๋‹ค.

์ž˜๋ชป๋œ lssn์€ "์ž‘์—… ์—†์Œ"๊ณผ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. ํด๋งํ•˜๋Š” lssn์ด ๊ทธ SK์˜ csn ์†Œ์†์ด ์•„๋‹ˆ๋ฉด, ๋Œ€๊ธฐ ์ž‘์—…์„ ์ฐพ๋Š” ์กฐ์ธ(tMgmtScriptList ms inner join tLSvr ls on ... where ls.csn = @csn and ms.lssn = @lssn)์ด ์•„๋ฌด ํ–‰๋„ ์ฐพ์ง€ ๋ชปํ•ด ๋นˆ ํ์™€ ๋™์ผํ•œ RstVal: 404๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ณ„๋„์˜ "๊ถŒํ•œ ์—†์Œ"์ด๋‚˜ "lssn ์—†์Œ" ์‘๋‹ต์€ ์—†๋‹ค โ€” ์ž˜๋ชป๋œ lssn์„ ํด๋งํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉด register๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด ๋น„๊ตํ•  ๊ฒƒ.

KVSPut (kFactor=cqeresult) โ€” ๊ฒฐ๊ณผ ๋ณด๊ณ 

์ „์šฉ "์™„๋ฃŒ/ack" ๋ช…๋ น์€ ์—†๋‹ค. ๊ฒฐ๊ณผ๋Š” GIIP์˜ ๋ชจ๋“  ์—์ด์ „ํŠธ ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ์— ์“ฐ์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฒ”์šฉ ํ‚ค-๊ฐ’ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ KVSPut์œผ๋กœ ๊ธฐ๋กํ•œ๋‹ค.

์š”์ฒญ:

text=KVSPut kType kKey kFactor
token=<sk>
jsondata={
  "kType": "lssn", "kKey": "71290", "kFactor": "cqeresult",
  "kValue": {"mslsn": 8032, "mssn": 123, "lssn": 71290,
             "status": "success", "exit_code": 0,
             "stdout": "...", "stderr": ""}
}

kType์€ ๋ฐ˜๋“œ์‹œ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด "lssn", kKey๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์†ํ•œ lssn(๋ฌธ์ž์—ด)์ด์–ด์•ผ ํ•œ๋‹ค.

register/poll๊ณผ ๋‹ฌ๋ฆฌ ์ด ํ˜ธ์ถœ์€ ์†Œ์œ ๊ถŒ์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ ๊น”๋”ํ•˜๊ฒŒ ์‹คํŒจํ•œ๋‹ค (giipdb/SP/pApiKVSPutbySk.sql ๊ฒ€ํ† ๋กœ ํ™•์ธ, 2026-09-06): SP๋Š” ์“ฐ๊ธฐ ์ „์— EXISTS(SELECT 1 FROM tLSvr WHERE LSsn = @kKey AND CGSn = <SK๋กœ๋ถ€ํ„ฐ ๋„์ถœ>)์„ ํ™•์ธํ•œ๋‹ค. lssn์ด ๊ทธ SK์˜ ํ‚ค ๊ทธ๋ฃน ์†Œ์œ ๊ฐ€ ์•„๋‹ˆ๋ฉด:

{"data":[{"RstVal":411,"RstMsg":"..."}]}

report์—์„œ 200์ด ์•„๋‹Œ RstVal์€ ๋ชจ๋‘ ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•  ๊ฒƒ โ€” heartbeat์ฒ˜๋Ÿผ ์žฌ์‹œ๋„ํ•˜์ง€ ๋ง๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์กฐ์šฉํžˆ ๋ฒ„๋ฆฌ์ง€๋„ ๋ง ๊ฒƒ.

๋“ฑ๋ก ํ•ด์ œ(unregister/deregister) ์—”๋“œํฌ์ธํŠธ ์—†์Œ

๋…ผ๋ฆฌ ๋จธ์‹ ์„ ์‚ญ์ œํ•˜๋Š” ํ˜ธ์ถœ์€ ์—†๋‹ค. heartbeat๋ฅผ ๋ฉˆ์ถ˜ ๋จธ์‹ ์€ ๊ทธ๋ƒฅ ์˜ค๋ž˜๋ผ ๊ฐˆ ๋ฟ์ด๋‹ค(LSLastHeartbeat๊ฐ€ ๋‚ก์•„๊ฐ) โ€” API ์ฐจ์›์˜ "์ž‘๋ณ„ ์ธ์‚ฌ"๋Š” ์—†๋‹ค.


๐Ÿ” ์‘๋‹ต ํ‘œ์ค€

์„ธ ๋ช…๋ น ์ค‘ ๋ฌด์—‡์„ ํ˜ธ์ถœํ•˜๋“  giipApiSk2 ํ˜ธ์ถœ์€ ํ•ญ์ƒ ๊ฒฐ๊ณผ๋ฅผ data ๋ฐฐ์—ด๋กœ ๊ฐ์‹ผ๋‹ค:

{ "data": [ { "RstVal": 200, ... } ] }
  • ์„ฑ๊ณต: RstVal์ด 200(๊ฐ€๋” AgentAutoRegister/CQEQueueGet์˜ ์—ฃ์ง€ ์ผ€์ด์Šค์—์„œ 201). RstVal์€ ๋ช…๋ น์— ๋”ฐ๋ผ ์ˆซ์ž ๋˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด์ด๋‹ค โ€” ์ด ๋ช…์„ธ์˜ ํด๋ผ์ด์–ธํŠธ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‘˜ ๋‹ค ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ž์—ด๋กœ ๋น„๊ตํ•œ๋‹ค.
  • poll์˜ "์ž‘์—… ์—†์Œ": RstVal 0 ๋˜๋Š” 404 โ€” ์„ฑ๊ณต, ์‹คํŒจ ์•„๋‹˜.
  • ์‹คํŒจ: ๊ทธ ์™ธ์˜ RstVal๊ณผ ํ•จ๊ป˜ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” RstMsg/Proc_MSG/ProcName.
  • ์ „์†ก ๊ณ„์ธต ์‹คํŒจ (๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜, ํƒ€์ž„์•„์›ƒ, 200์ด ์•„๋‹Œ HTTP ์ƒํƒœ): ์š”์ฒญ์ด ์Šคํ† ์–ด๋“œ ํ”„๋กœ์‹œ์ €์— ์•„์˜ˆ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๋œป โ€” RstVal ์‹คํŒจ์™€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์‹คํŒจ ์œ ํ˜•์ด๋‹ค.

๐Ÿค– AI ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ์ „์ฒด ์ ˆ์ฐจ (๋“ฑ๋ก โ†’ ํด๋ง โ†’ ๋ณด๊ณ )

export GIIP_API_KEY="<the SK>"

# 1. ๋“ฑ๋ก (๋ฉฑ๋“ฑ โ€” ์ตœ์ดˆ ํ˜ธ์ถœ์€ lssn์„ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ™์€ hostname์˜ ์ดํ›„ ํ˜ธ์ถœ์€
#    ๊ทธ lssn์— ๋Œ€ํ•œ heartbeat)
python scripts/giip_agent.py register --tool-slug claude-code
# {"success": true, "hostname": "Lowy-DP01-claude-code", "lssn": 71290, "action": "new"}

# 2. ํ•œ ๋ฒˆ ํด๋ง. ์ž์ฒด ์ผ์ •(~60์ดˆ)์œผ๋กœ ๋ฐ˜๋ณตํ•  ๊ฒƒ -- ๋‚ด๋ถ€์—์„œ ๋ฐ˜๋ณตํ•˜์ง€ ๋ง ๊ฒƒ.
python scripts/giip_agent.py poll --lssn 71290 --tool-slug claude-code
# {"success": true, "lssn": 71290, "has_work": false}

# 3. has_work๊ฐ€ true๋ฉด ms_body๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ .
python scripts/giip_agent.py report --lssn 71290 --mslsn 8032 --mssn 123 \
  --status success --exit-code 0

โš ๏ธ ์ค‘์š” ์ฐธ๊ณ ์‚ฌํ•ญ

  • ์ด์Šˆ ๊ด€๋ฆฌ API์™€๋Š” ๋‹ค๋ฅธ API ๊ณ„์—ด์ด๋‹ค. ๋‘˜์„ ํ˜ผ๋™ํ•˜์ง€ ๋ง ๊ฒƒ: giip-issue ํด๋ผ์ด์–ธํŠธ๋Š” SK๋ฅผ x-api-key ํ—ค๋”๋กœ ์‹ค์ œ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” REST ์—”๋“œํฌ์ธํŠธ์— ๋ณด๋‚ด๊ณ , giip-agent ํด๋ผ์ด์–ธํŠธ๋Š” SK๋ฅผ token ํผ ํ•„๋“œ๋กœ ํ•ญ์ƒ HTTP 200์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ์ผ ๋””์ŠคํŒจ์ฒ˜ ์—”๋“œํฌ์ธํŠธ์— ๋ณด๋‚ธ๋‹ค.
  • ํ˜ธ์ŠคํŠธ๋ช… ๊ทœ์น™์€ ์„œ๋ฒ„ ์ œ์•ฝ์ด ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ ์ธก ๊ทœ์œจ์ด๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋„๊ตฌ์— ๋Œ€ํ•ด foo๋ฅผ ๋‘ ๋ฒˆ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์žฅ์น˜๋Š” ์—†๋‹ค โ€” ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋กœ์˜ ํ ์ด๋ ฅ์„ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ lssn์ด ์ƒ๊ธด๋‹ค. <host>-<tool-slug> ๊ทœ์น™์„ ์—„๊ฒฉํžˆ ์ง€ํ‚ฌ ๊ฒƒ.
  • ์‹œ์Šคํ…œ ์ •๋ณด ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋ฐ˜๋ณต register๋Š” ์—ฌ์ „ํžˆ heartbeat๋‹ค โ€” ์ƒˆ ๋จธ์‹ ์ด ์•„๋‹ˆ๋‹ค. ์ •์ฒด์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์˜ค์ง hostname ๋ฌธ์ž์—ด์ด๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

์ฆ์ƒ์›์ธํ•ด๊ฒฐ
AgentAutoRegister์—์„œ data[0].RstVal์ด 401SK๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์žฌ๋ฐœ๊ธ‰๋จ/svclist์—์„œ SK ์žฌํ™•์ธ
poll์ด ๊ณ„์† RstVal 404/has_work: false์‹ค์ œ๋กœ ํ๊ฐ€ ์—†๊ฑฐ๋‚˜, lssn์ด ์ด SK์™€ ๋‹ค๋ฅธ csn ์†Œ์†register๋ฅผ ์žฌ์‹คํ–‰ํ•ด ๋ฐ˜ํ™˜๋œ lssn์„ ๋น„๊ต
report๊ฐ€ RstVal 411 ๋ฐ˜ํ™˜lssn์ด ์ด SK์˜ ํ‚ค ๊ทธ๋ฃน(cgsn) ์†Œ์œ ๊ฐ€ ์•„๋‹˜์ž์‹ ์˜ register ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜ํ•œ lssn์—๋งŒ ๋ณด๊ณ 
HTTP ์ƒํƒœ ์ž์ฒด๊ฐ€ 200์ด ์•„๋‹˜์ „์†ก ๊ณ„์ธต ์‹คํŒจ(๋„คํŠธ์›Œํฌ, ๋ผ์šฐํ„ฐ ์ž์ฒด๊ฐ€ ๊ฑฐ๋ถ€ํ•œ ์ž˜๋ชป๋œ ์š”์ฒญ)RstVal ์‹คํŒจ์™€๋Š” ๋‹ค๋ฆ„ โ€” ์—ฐ๊ฒฐ ํ™•์ธ ํ›„ ์žฌ์‹œ๋„๊ฐ€ ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Œ(RstVal ์‹คํŒจ๋Š” ์žฌ์‹œ๋„ ๊ธˆ์ง€)
ํ•œ ๋จธ์‹ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์„œ๋กœ ๋‹ค๋ฅธ lssn ๋‘ ๊ฐœ๊ฐ€ ๋‚˜ํƒ€๋‚จhostname ๊ตฌ์„ฑ์ด ์ผ๊ด€๋˜์ง€ ์•Š์Œ(๋‹ค๋ฅธ --tool-slug ์‚ฌ์šฉ, ๋˜๋Š” bare hostname์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ)hostname์€ ํ•ญ์ƒ <host>-<tool-slug>๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ํ˜ธ์ถœ ๊ฐ„ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€

๋ฒ„์ „: 1.0 ์ตœ์ข… ๊ฐฑ์‹ : 2026-09-06 (giipfaw ํ”„๋กœ๋•์…˜ ๋ผ์ด๋ธŒ ๊ฒ€์ฆ, csn 47, ๊ฒฐ๊ณผ lssn 71290) ์†Œ์Šค ํŒŒ์ผ: giipv3/public/help/giip-agent-api.ko.md

v1.0 (2026-09-06, giip #2081): ์ตœ์ดˆ ๋ฆด๋ฆฌ์Šค. giipdb/SP/pApiAgentAutoRegisterBySK.sql, pApiCQEQueueGetbySK.sql, pApiKVSPutbySk.sql, giipfaw/giipApiSk2/run.ps1 ์†Œ์Šค ๊ฒ€ํ† ์™€ giipAgentLinux(scripts/giip-auto-discover.sh, lib/cqe.sh, lib/kvs.sh, cqe/giipCQE.sh)์˜ ํ”„๋กœ๋•์…˜ ํด๋ผ์ด์–ธํŠธ ๋™์ž‘์„ ๊ทผ๊ฑฐ๋กœ, giipApiSk2 ๋””์ŠคํŒจ์ฒ˜ ์œ„์˜ AgentAutoRegister, CQEQueueGet, KVSPut(kFactor=cqeresult)์„ ๋ฌธ์„œํ™”ํ–ˆ๋‹ค. ๋ผ์ด๋ธŒ ๊ฒ€์ฆ: register 1ํšŒ(์‹ ๊ทœ lssn 71290), ๋ฐ˜๋ณต register 1ํšŒ(heartbeat, ๋™์ผ lssn), poll 1ํšŒ(ํ ์—†์Œ).


๊ด€๋ จ ๋ฌธ์„œ: