From 69e68d229585ac7c02508c8fa100f2badb42d829 Mon Sep 17 00:00:00 2001 From: Dale Seo <5466341+DaleSeo@users.noreply.github.com> Date: Fri, 26 Jun 2026 09:22:35 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20OpenAI=20=EB=AA=A8=EB=8D=B8=EC=9D=84=20?= =?UTF-8?q?gpt-4.1-nano=EC=97=90=EC=84=9C=20gpt-5-nano=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - reasoning 모델 호환: max_tokens→max_completion_tokens, temperature 제거→reasoning_effort:minimal - 사용량 비용 단가/라벨을 gpt-5-nano 기준으로 갱신(입력 $0.10→$0.05/1M) - 코드 리뷰 프롬프트에 길이(500자)·한국어 전용 제약 강화 --- handlers/complexity-analysis.js | 6 +++--- tests/learningComment.test.js | 2 +- tests/tag-patterns.test.js | 2 +- utils/learningComment.js | 6 +++--- utils/openai.js | 24 ++++++++++++++---------- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/handlers/complexity-analysis.js b/handlers/complexity-analysis.js index 8fd0fc5..e30e3f8 100644 --- a/handlers/complexity-analysis.js +++ b/handlers/complexity-analysis.js @@ -255,14 +255,14 @@ export async function callComplexityAnalysis(fileEntries, apiKey) { "Content-Type": "application/json", }, body: JSON.stringify({ - model: "gpt-4.1-nano", + model: "gpt-5-nano", messages: [ { role: "system", content: SYSTEM_PROMPT }, { role: "user", content: userPrompt }, ], response_format: { type: "json_object" }, - max_tokens: 4000, - temperature: 0.2, + max_completion_tokens: 5000, + reasoning_effort: "minimal", }), }); diff --git a/tests/learningComment.test.js b/tests/learningComment.test.js index 3e9c328..581eef3 100644 --- a/tests/learningComment.test.js +++ b/tests/learningComment.test.js @@ -49,7 +49,7 @@ describe("upsertLearningStatusComment — usage history accumulation", () => { expect(post).toBeDefined(); const body = parseBody(post); - expect(body).toContain("🔢 API 사용량 (gpt-4.1-nano)"); + expect(body).toContain("🔢 API 사용량 (gpt-5-nano)"); expect(body).toContain("| 1 | 100 | 50 | 150 |"); // single-row history => no totals row expect(body).not.toContain("**합계**"); diff --git a/tests/tag-patterns.test.js b/tests/tag-patterns.test.js index b6579e5..30b4c49 100644 --- a/tests/tag-patterns.test.js +++ b/tests/tag-patterns.test.js @@ -65,7 +65,7 @@ function makePrData(overrides = {}) { /** * 두 OpenAI 엔드포인트(패턴 분석 N콜 + 복잡도 분석 1콜)를 분기한다. - * 복잡도 호출은 system_prompt 에 "복잡도" 가 포함되거나 max_tokens >= 1000 으로 식별. + * 복잡도 호출은 system_prompt 에 "시간/공간 복잡도를 분석" 이 포함되는지로 식별. */ function makeFetchMock({ solutionFiles, diff --git a/utils/learningComment.js b/utils/learningComment.js index ed7ac0d..8cf409b 100644 --- a/utils/learningComment.js +++ b/utils/learningComment.js @@ -20,8 +20,8 @@ const COMMENT_MARKER = ""; */ const USAGE_DATA_RE = //; -/** gpt-4.1-nano pricing (USD per token) */ -const INPUT_COST_PER_TOKEN = 0.10 / 1_000_000; +/** gpt-5-nano pricing (USD per token) */ +const INPUT_COST_PER_TOKEN = 0.05 / 1_000_000; const OUTPUT_COST_PER_TOKEN = 0.40 / 1_000_000; /** @@ -72,7 +72,7 @@ function parseUsageFromComment(body) { function formatUsageSection(history) { const lines = []; lines.push("
"); - lines.push("🔢 API 사용량 (gpt-4.1-nano)"); + lines.push("🔢 API 사용량 (gpt-5-nano)"); lines.push(""); lines.push("| 요청 | 입력 토큰 | 출력 토큰 | 합계 | 비용 |"); lines.push("|---:|---:|---:|---:|---:|"); diff --git a/utils/openai.js b/utils/openai.js index bc8f7ee..99cda69 100644 --- a/utils/openai.js +++ b/utils/openai.js @@ -37,7 +37,11 @@ PR의 코드 변경 사항을 참고하여 사용자의 질문에 명확하고 단순히 지적만 하지 말고, 격려와 학습이 되는 피드백을 함께 주세요. 해당 사항없는 항목은 생략하고 자연스럽게 작성하세요. -500 글자를 초과하지 말아주세요. + +[작성 규칙 — 반드시 지킬 것] +- 전체 응답은 한국어 기준 500자 이내. 절대 초과하지 마세요. 분량이 넘칠 것 같으면 가장 중요한 피드백만 남기고 나머지는 생략하세요. +- 한국어로만 작성하세요. 중국어·일본어 한자나 다른 언어를 섞지 마세요(예: "一致" 금지, "일치" 사용). +- 항목은 3개 이내로 압축하고, 장황한 설명 없이 핵심만 간결하게 쓰세요. `; let userPrompt = `# PR Title @@ -65,13 +69,13 @@ ${prDiff} "Content-Type": "application/json", }, body: JSON.stringify({ - model: "gpt-4.1-nano", + model: "gpt-5-nano", messages: [ { role: "system", content: systemPrompt }, { role: "user", content: userPrompt }, ], - max_tokens: 2000, - temperature: 0.7, + max_completion_tokens: 3000, + reasoning_effort: "minimal", }), }); @@ -143,14 +147,14 @@ ${fileContent} "Content-Type": "application/json", }, body: JSON.stringify({ - model: "gpt-4.1-nano", + model: "gpt-5-nano", messages: [ { role: "system", content: systemPrompt }, { role: "user", content: userPrompt }, ], response_format: { type: "json_object" }, - max_tokens: 500, - temperature: 0.3, + max_completion_tokens: 2000, + reasoning_effort: "minimal", }), }); @@ -221,14 +225,14 @@ ${truncatedContent} "Content-Type": "application/json", }, body: JSON.stringify({ - model: "gpt-4.1-nano", + model: "gpt-5-nano", messages: [ { role: "system", content: systemPrompt }, { role: "user", content: userPrompt }, ], response_format: { type: "json_object" }, - max_tokens: 200, - temperature: 0.2, + max_completion_tokens: 1500, + reasoning_effort: "minimal", }), });