diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 75eca7a..9b8ceb5 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -12,7 +12,7 @@ "name": "ennoia", "source": "./plugins/ennoia", "description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.", - "version": "1.5.5" + "version": "1.5.6" } ] } diff --git a/evals/2026-10-27-model-family-selection-summary.md b/evals/2026-10-27-model-family-selection-summary.md new file mode 100644 index 0000000..2d5ad4b --- /dev/null +++ b/evals/2026-10-27-model-family-selection-summary.md @@ -0,0 +1,20 @@ +# GPT·Gemini 공통 모델 선택 회귀 + +2026-10-27에 PR #25의 공통 모델 선택 기준이 Sonnet에 한정되는지 추가 확인했다. 제품 지침에는 특정 provider·모델명 분기가 없으며, 지침을 변경하지 않은 commit `712db57`에 GPT 8개·Gemini 8개의 합성 입력을 적용했다. 같은 상위 세션의 모델 설정을 상속한 fresh context 5개에서 각 16개 입력을 독립 평가했다. 평가자에게 build Skill·필요한 내부 reference와 입력만 제공하고 rubric·다른 출력·diff를 읽지 않도록 했다. + +| 경로 | GPT 5회 | Gemini 5회 | +| --- | --- | --- | +| 같은 등급 안에서 최신 버전 선택 | 모두 최신 mini 선택, 더 비싼 별도 등급 유지 경계 준수 | 모두 최신 Flash 선택, Pro로 임의 변경하지 않음 | +| 다음 페이지가 남음 | 모두 `query=gpt`, `page=1` 추가 조회 | 모두 `query=gemini`, `page=1` 추가 조회 | +| 구버전 exact 검색만 확보 | 모두 버전 없는 `gpt`로 재검색 | 모두 버전 없는 `gemini`로 재검색 | +| 사용자 exact 모델 지정 | 모두 지정 버전 보존 | 모두 지정 버전 보존 | +| 최신 후보가 필수 기능 미지원 | 모두 구조화 출력 지원 후보 선택·제약 설명 | 모두 이미지 입력 지원 후보 선택·제약 설명 | +| 기반 버전을 알 수 없는 alias | 모두 추가 정보 확인 전 최신 선택 보류 | 모두 추가 정보 확인 전 최신 선택 보류 | +| 공개 최신 모델이 프로젝트에는 없음 | 모두 현재 프로젝트에 있는 exact 모델명 사용 | 모두 현재 프로젝트에 있는 exact 모델명 사용 | +| 기존 에이전트의 말투만 수정 | 모두 기존 모델 보존 | 모두 기존 모델 보존 | + +작성자는 5개 원본 JSON의 모델 선택·다음 도구 인자·근거를 별도 [판정 기준](model-family-selection-rubric.md)과 대조했다. 전 사례가 기준을 충족했고 Sonnet 전용으로 처리하는 경로는 관찰되지 않았다. 최초 Sonnet 중심 평가와 이번 GPT·Gemini 회귀는 구분하며, 이번 확인으로 제품 지침을 추가 수정하지 않았다. + +입력 SHA-256은 `04f89a87f9783ddbdbdfa43bc7316d8e05b6e51a57eee4db2b63760f4aa71896`이다. 적용한 build Skill은 `11a50397b4a4ba4b67b6299bfa2daa95f7035e53aaf3e020efabcee09fd0f82b`, 모델 선택 reference는 `b26f2436bdd3ee6eda89f63e5dacc8ac26462657e9b2c37277810aad49d44e52`로 최초 후보와 동일하다. 원본 출력은 Git 제외 로컬 `docs/model-family-selection-eval/run-1.json`부터 `run-5.json`에 보관했다. + +모델명·버전 관계는 합성 입력이다. 실제 공개 최신 모델·현재 프로젝트 카탈로그를 조회하거나 GPT·Gemini 에이전트를 생성·검증·저장한 결과가 아니며 native host 실행 성공이나 통계적 성공률로 해석하지 않는다. 이번 변경은 패키지 밖 평가 자료만 추가하므로 Plugin version과 기존 제품 코드는 바꾸지 않았다. JSON 형식·case ID·input-only 필드·diff 공백을 확인했으며 변경되지 않은 제품의 Python·Node 검사는 새 근거 없이 반복하지 않았다. diff --git a/evals/2026-10-27-model-selection-summary.md b/evals/2026-10-27-model-selection-summary.md new file mode 100644 index 0000000..03ff46d --- /dev/null +++ b/evals/2026-10-27-model-selection-summary.md @@ -0,0 +1,26 @@ +# 모델 자동 선택 지침 비교 + +2026-10-27에 동일한 10개 합성 입력을 변경 전·후 각각 fresh context 5회로 평가했다. 기존 지침은 main `b1f6cc6`의 1.5.5이며 후보는 1.5.6이다. 모든 평가자는 동일한 상위 세션의 모델 설정을 상속했고 모델 override를 사용하지 않았다. 평가자는 build Skill과 필요한 내부 reference, 입력만 읽었으며 다른 평가 출력·rubric·diff는 제공하지 않았다. 최종 출력 후 작성자가 별도 rubric으로 다음 행동과 모델 선택을 확인했다. + +| 관찰 경로 | 기존 5회 | 후보 5회 | +| --- | --- | --- | +| 모델군 첫 페이지에 구버전만 있고 다음 페이지가 남음 | 모두 `sonnet4-6`을 선택하고 추가 조회 생략 | 모두 같은 모델군의 `page=1`을 먼저 조회하고 선택 보류 | +| 기억한 구버전 exact 이름으로만 검색함 | 모두 `sonnet4-6`으로 선택 확정 | 모두 버전 없는 `query=sonnet`, `page=0`으로 재검색 | +| 현재 카탈로그 미조회 | 모두 현재 프로젝트 모델 조회 | 같은 경계 유지 | +| 숫자 major/minor 비교 | 모두 `sonnet10-1` 선택 | 같은 선택 유지 | +| 사용자가 exact 버전 지정 | 모두 지정한 `sonnet4-6` 유지 | 같은 선택 유지 | +| 모델군만 지정 | 모두 `sonnet5.5` 선택 | 같은 선택 유지 | +| 최신 후보가 필수 RAG 미지원 | 모두 RAG 가능한 `sonnet4-6` 선택 | 같은 선택 유지, 최신 후보의 기능 제약 설명 | +| 버전을 알 수 없는 custom alias | 모두 최신을 확정하지 않고 추가 정보 확인 | 같은 경계 유지 | +| 기존 agent의 말투만 변경 | 모두 기존 모델 보존 | 같은 경계 유지 | +| 저비용 분류 업무 | 모두 Haiku 안의 `haiku4-5` 선택 | 같은 등급·선택 유지 | + +개선으로 확인한 경로는 앞의 두 가지다. 기존에도 올바르게 처리한 8개 경로를 개선 실적으로 계산하지 않는다. 기존 평가에서 “충분한 자원을 찾으면 모든 페이지를 읽지 않는다”, “모델군 전체 비교 의무가 없다”는 이유로 구버전을 확정하는 행동을 확인했다. 후보는 관련 모델군의 최신 후보 확인을 완료 조건으로 삼고, 일반 자원 pagination 규칙과 모델 선택 기준을 연결했다. + +입력 SHA-256은 `d0c1af26499651928ec5ae1f73228764f45a9151192349d477518d53f98b102d`다. 기존 build Skill은 `3ba79b76a1a2161a735c54395e865ba5502ab788e50468b10e1b84a7f34dc271`, 후보 build Skill은 `11a50397b4a4ba4b67b6299bfa2daa95f7035e53aaf3e020efabcee09fd0f82b`, 후보 모델 선택 reference는 `b26f2436bdd3ee6eda89f63e5dacc8ac26462657e9b2c37277810aad49d44e52`다. 원본 JSON 출력 10개와 기존 Skill 복사본은 Git 제외 로컬 `docs/model-selection-eval/`에 보관했다. + +이 결과는 합성 입력에 대한 다음 의사결정 평가다. 다음 페이지의 실제 응답이나 실제 모델 실행·graph 검증·저장은 수행하지 않았으며, 가상 모델명·버전 관계는 실제 출시 정보의 증거가 아니다. 5회의 일치 결과를 통계적 성공률이나 모든 host에서의 동작 보장으로 해석하지 않는다. native 설치·새 세션 Skill 로딩·실제 MCP 업무는 별도 미검증 범위다. + +패키지 검증·manifest sync·기존 결과 schema 검사, Python 회귀 63개와 Node 회귀 36개는 통과했다. 최초 시스템 Python 실행은 `jsonschema` 의존성 부재로 실패했으며, 저장소의 `requirements-dev.txt`를 별도 venv에 설치한 뒤 전체 검사를 통과했다. + +Claude CLI의 Marketplace·Plugin `validate --strict`도 exit 0으로 통과했다. Plugin Directory 제출용 추가 진단에는 기존 LICENSE 부재와 privacy policy URL 부재가 표시됐다. 해당 Directory 제출 검사는 이번 모델 선택 변경 범위가 아니며, native 설치·OAuth·실행 성공의 증거로 사용하지 않는다. diff --git a/evals/README.md b/evals/README.md index e3b5f11..ebbf2b7 100644 --- a/evals/README.md +++ b/evals/README.md @@ -1,5 +1,11 @@ # Skill 동작 평가 +## 모델 자동 선택 + +[`model-selection-scenarios.json`](model-selection-scenarios.json)은 카탈로그 미조회, pagination, 구버전으로 한정한 검색, 숫자 버전 비교, exact 모델 지정, 모델군 지정, 필수 기능, 불명확한 alias, 기존 설정 보존, 업무에 맞는 등급 유지의 10개 합성 입력이다. 입력만 제공한 다음 별도 [평가 기준](model-selection-rubric.md)으로 다음 행동과 모델 선택을 판정한다. [변경 전·후 반복 평가](2026-10-27-model-selection-summary.md)에 개선된 두 경로와 기존에도 통과한 경로를 구분했다. 가상 모델명과 버전 관계는 실제 출시 정보나 프로젝트 사용 가능 여부의 증거가 아니다. 합성 모델 판단과 실제 MCP·host 실행 검증을 구분한다. + +[`model-family-selection-scenarios.json`](model-family-selection-scenarios.json)은 같은 공통 지침을 GPT·Gemini에도 적용하는 16개 추가 입력이다. [판정 기준](model-family-selection-rubric.md)과 [반복 평가 결과](2026-10-27-model-family-selection-summary.md)에 모델군·등급별 최신 선택, 페이지 조회, 지정 모델·기능·기존 설정 보존을 기록했다. 최초 Sonnet 중심 평가와 구분하며 제품 지침의 provider별 분기를 추가하지 않았다. + ## 개인 OAuth 연결 복구 [`oauth-recovery-scenarios.json`](oauth-recovery-scenarios.json)은 승인 대기·만료·중복 요청·ACTIVE 판정·완료 화면·신규 등록 구분·민감 URL의 8개 합성 입력이다. [판정 기준](oauth-recovery-rubric.md)은 실제 API 실행과 구분하며, [기존·후보 비교](2026-10-27-oauth-recovery-summary.md)에서 기존 지침도 통과한 행동은 개선 실적으로 세지 않는다. diff --git a/evals/model-family-selection-rubric.md b/evals/model-family-selection-rubric.md new file mode 100644 index 0000000..935fbd8 --- /dev/null +++ b/evals/model-family-selection-rubric.md @@ -0,0 +1,16 @@ +# GPT·Gemini 모델군 회귀 평가 + +`model-family-selection-scenarios.json`의 prompt·observations·environment만 평가자에게 제공한다. 제품 지침은 변경하지 않고 PR #25의 동일한 공통 모델 선택 기준을 적용한다. 모델명과 버전 관계는 합성이며 실제 출시 정보가 아니다. + +| 공통 suffix | GPT 통과 기준 | Gemini 통과 기준 | +| --- | --- | --- | +| `latest-in-tier` | mini 등급에서 `gpt-10.1-mini` 선택; 더 비싼 기본 등급의 `gpt-10.2`로 올리지 않음 | Flash 등급에서 `gemini-10.1-flash` 선택; 더 비싼 Pro 등급으로 올리지 않음 | +| `family-pagination` | `query=gpt`, `page=1` 조회 후 선택 확정 | `query=gemini`, `page=1` 조회 후 선택 확정 | +| `version-filtered` | 버전을 포함하지 않은 `query=gpt`, `page=0`으로 재검색 | 버전을 포함하지 않은 `query=gemini`, `page=0`으로 재검색 | +| `exact-pinned` | 사용자 지정 `gpt-9.9-mini` 유지 | 사용자 지정 `gemini-9.9-flash` 유지 | +| `required-capability` | 구조화 출력이 필수이므로 지원하는 `gpt-9.9-mini` 선택·최신 후보의 미지원 설명 | 이미지 입력이 필수이므로 지원하는 `gemini-9.9-flash` 선택·최신 후보의 미지원 설명 | +| `opaque-aliases` | 실제 버전 정보 확인 전 최신 모델을 확정하지 않음 | 실제 버전 정보 확인 전 최신 모델을 확정하지 않음 | +| `project-availability` | 현재 프로젝트에 있는 `gpt-9.9-mini` 사용; 목록에 없는 모델명 합성 금지 | 현재 프로젝트에 있는 `gemini-9.9-flash` 사용; 목록에 없는 모델명 합성 금지 | +| `existing-model` | 말투만 변경하고 기존 `gpt-9.9-mini` 유지 | 말투만 변경하고 기존 `gemini-9.9-flash` 유지 | + +같은 16개 입력을 fresh context 5회 반복하고 다음 행동과 exact model_name을 원본 출력에서 확인한다. 앞선 Sonnet 중심 평가와 이번 회귀 평가를 구분하며, 실제 MCP·host 업무 성공이나 통계적 성공률로 표현하지 않는다. diff --git a/evals/model-family-selection-scenarios.json b/evals/model-family-selection-scenarios.json new file mode 100644 index 0000000..fecbafe --- /dev/null +++ b/evals/model-family-selection-scenarios.json @@ -0,0 +1,436 @@ +[ + { + "id": "gpt-latest-in-tier", + "prompt": "GPT mini 계열로 짧은 문서를 분류하는 에이전트를 만들어줘. 버전은 맡길게.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gpt-9.9-mini" + }, + { + "model_name": "gpt-10.1-mini" + }, + { + "model_name": "gpt-10.2" + } + ], + "has_next": false, + "page": 0, + "total_elements": 3 + } + }, + "arguments": { + "query": "gpt", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 작업 난이도·비용·필수 기능에 맞는 등급은 GPT mini로 판단했다. 이 등급의 두 후보 모두 요구를 만족한다. gpt-10.2는 더 비싼 별도 등급이고 요구 범위 밖이다. 반환 순서는 출시 순서가 아니다." + }, + { + "id": "gpt-family-pagination", + "prompt": "문서 분류 에이전트를 만들어줘. 모델은 맡길게. 불필요한 조회를 줄이고 빨리 진행해줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gpt-9.9-mini" + } + ], + "has_next": true, + "page": 0, + "total_elements": 2, + "next_page": 1 + } + }, + "arguments": { + "query": "gpt", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 업무에 적합한 등급은 GPT mini다. gpt-9.9-mini로 이전에 성공했다. page=1은 아직 관측하지 않았다." + }, + { + "id": "gpt-version-filtered", + "prompt": "문서 분류 에이전트를 만들어줘. 모델은 적당히 골라줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gpt-9.9-mini" + } + ], + "has_next": false, + "page": 0, + "total_elements": 1 + } + }, + "arguments": { + "query": "gpt-9.9-mini", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 업무에 적합한 등급은 GPT mini다. 관측한 목록은 기억한 구버전 exact 이름으로 검색한 결과뿐이다." + }, + { + "id": "gpt-exact-pinned", + "prompt": "gpt-9.9-mini 모델로 고정해서 만들어줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gpt-9.9-mini" + }, + { + "model_name": "gpt-10.1-mini" + } + ], + "has_next": false, + "page": 0, + "total_elements": 2 + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 두 후보 모두 현재 프로젝트에서 사용 가능하고 필수 기능을 지원한다." + }, + { + "id": "gpt-required-capability", + "prompt": "GPT mini 계열로 구조화 JSON 출력을 반드시 지원하는 에이전트를 만들어줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gpt-10.1-mini", + "supports_response_format": false + }, + { + "model_name": "gpt-9.9-mini", + "supports_response_format": true + } + ], + "has_next": false, + "page": 0, + "total_elements": 2 + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 구조화 JSON 출력은 필수다. 해당 지원 여부는 현재 catalog와 node schema에서 확인됐다." + }, + { + "id": "gpt-opaque-aliases", + "prompt": "프로젝트에서 쓸 수 있는 최신 GPT mini로 만들어줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gpt-team-a" + }, + { + "model_name": "gpt-team-b" + } + ], + "has_next": false, + "page": 0, + "total_elements": 2 + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 목록의 custom alias에는 실제 기반 버전과 release metadata가 없다. 앞서 설명한 숫자 버전 모델들은 이 목록에 없다." + }, + { + "id": "gpt-project-availability", + "prompt": "GPT mini로 문서 분류 에이전트를 만들어줘. 버전은 맡길게.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gpt-9.9-mini" + } + ], + "has_next": false, + "page": 0, + "total_elements": 1 + } + }, + "arguments": { + "query": "gpt", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 조회한 현재 프로젝트의 전체 해당 등급 후보는 gpt-9.9-mini 하나다. 공개 최신 모델로 gpt-10.1-mini를 알고 있더라도 현재 프로젝트 catalog에는 없다. 현재 후보는 필수 기능·비용 조건을 만족한다." + }, + { + "id": "gpt-existing-model", + "prompt": "기존 분류 에이전트의 답변 말투만 정중하게 바꿔줘.", + "observations": [ + { + "tool": "get_multi_agent_node_prompts", + "result": { + "ok": true, + "data": { + "nodes": [ + { + "node_id": "classifier", + "model_name": "gpt-9.9-mini", + "prompt": "세 범주로 분류한다." + } + ] + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 GPT mini 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 기존 모델은 gpt-9.9-mini이고 프로젝트에는 gpt-10.1-mini도 있다. 전용 노드 프롬프트 편집 도구가 지원된다. 수정에 필요한 누락 metadata는 추측하지 않는다." + }, + { + "id": "gemini-latest-in-tier", + "prompt": "Gemini Flash 계열로 짧은 문서를 분류하는 에이전트를 만들어줘. 버전은 맡길게.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gemini-9.9-flash" + }, + { + "model_name": "gemini-10.1-flash" + }, + { + "model_name": "gemini-10.2-pro" + } + ], + "has_next": false, + "page": 0, + "total_elements": 3 + } + }, + "arguments": { + "query": "gemini", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 작업 난이도·비용·필수 기능에 맞는 등급은 Gemini Flash로 판단했다. 이 등급의 두 후보 모두 요구를 만족한다. gemini-10.2-pro는 더 비싼 별도 등급이고 요구 범위 밖이다. 반환 순서는 출시 순서가 아니다." + }, + { + "id": "gemini-family-pagination", + "prompt": "문서 분류 에이전트를 만들어줘. 모델은 맡길게. 불필요한 조회를 줄이고 빨리 진행해줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gemini-9.9-flash" + } + ], + "has_next": true, + "page": 0, + "total_elements": 2, + "next_page": 1 + } + }, + "arguments": { + "query": "gemini", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 업무에 적합한 등급은 Gemini Flash다. gemini-9.9-flash로 이전에 성공했다. page=1은 아직 관측하지 않았다." + }, + { + "id": "gemini-version-filtered", + "prompt": "문서 분류 에이전트를 만들어줘. 모델은 적당히 골라줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gemini-9.9-flash" + } + ], + "has_next": false, + "page": 0, + "total_elements": 1 + } + }, + "arguments": { + "query": "gemini-9.9-flash", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 업무에 적합한 등급은 Gemini Flash다. 관측한 목록은 기억한 구버전 exact 이름으로 검색한 결과뿐이다." + }, + { + "id": "gemini-exact-pinned", + "prompt": "gemini-9.9-flash 모델로 고정해서 만들어줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gemini-9.9-flash" + }, + { + "model_name": "gemini-10.1-flash" + } + ], + "has_next": false, + "page": 0, + "total_elements": 2 + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 두 후보 모두 현재 프로젝트에서 사용 가능하고 필수 기능을 지원한다." + }, + { + "id": "gemini-required-capability", + "prompt": "Gemini Flash 계열로 이미지 입력을 반드시 지원하는 에이전트를 만들어줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gemini-10.1-flash", + "supports_image": false + }, + { + "model_name": "gemini-9.9-flash", + "supports_image": true + } + ], + "has_next": false, + "page": 0, + "total_elements": 2 + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 이미지 입력은 필수다. 해당 지원 여부는 현재 catalog와 node schema에서 확인됐다." + }, + { + "id": "gemini-opaque-aliases", + "prompt": "프로젝트에서 쓸 수 있는 최신 Gemini Flash로 만들어줘.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gemini-team-a" + }, + { + "model_name": "gemini-team-b" + } + ], + "has_next": false, + "page": 0, + "total_elements": 2 + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 목록의 custom alias에는 실제 기반 버전과 release metadata가 없다. 앞서 설명한 숫자 버전 모델들은 이 목록에 없다." + }, + { + "id": "gemini-project-availability", + "prompt": "Gemini Flash로 문서 분류 에이전트를 만들어줘. 버전은 맡길게.", + "observations": [ + { + "tool": "list_multi_agent_models", + "result": { + "ok": true, + "data": { + "items": [ + { + "model_name": "gemini-9.9-flash" + } + ], + "has_next": false, + "page": 0, + "total_elements": 1 + } + }, + "arguments": { + "query": "gemini", + "page": 0 + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 조회한 현재 프로젝트의 전체 해당 등급 후보는 gemini-9.9-flash 하나다. 공개 최신 모델로 gemini-10.1-flash를 알고 있더라도 현재 프로젝트 catalog에는 없다. 현재 후보는 필수 기능·비용 조건을 만족한다." + }, + { + "id": "gemini-existing-model", + "prompt": "기존 분류 에이전트의 답변 말투만 정중하게 바꿔줘.", + "observations": [ + { + "tool": "get_multi_agent_node_prompts", + "result": { + "ok": true, + "data": { + "nodes": [ + { + "node_id": "classifier", + "model_name": "gemini-9.9-flash", + "prompt": "세 범주로 분류한다." + } + ] + } + } + } + ], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 모델명은 가상이며 같은 Gemini Flash 등급의 숫자 major/minor에서 10.1이 9.9보다 최신이라는 naming contract가 확인됐다. 실제 서비스·웹 호출 없이 다음 행동과 exact model_name을 작성한다. 기존 모델은 gemini-9.9-flash이고 프로젝트에는 gemini-10.1-flash도 있다. 전용 노드 프롬프트 편집 도구가 지원된다. 수정에 필요한 누락 metadata는 추측하지 않는다." + } +] diff --git a/evals/model-selection-rubric.md b/evals/model-selection-rubric.md new file mode 100644 index 0000000..efaf7b2 --- /dev/null +++ b/evals/model-selection-rubric.md @@ -0,0 +1,18 @@ +# 모델 자동 선택 평가 기준 + +`model-selection-scenarios.json`의 입력만 평가자에게 제공한다. 각 case의 다음 행동, exact `model_name`, 이유를 작성한 뒤 이 기준으로 판정한다. 모델명·버전 관계는 합성 입력이며 실제 출시·프로젝트 사용 가능 여부의 증거가 아니다. + +| Case | 통과 기준 | +| --- | --- | +| `unqueried-default` | 현재 프로젝트에서 `list_multi_agent_models`를 조회한다. 다른 세션의 모델명만으로 graph를 확정하지 않는다. | +| `family-pagination` | Sonnet 검색의 `next_page=1`을 조회한 뒤 버전을 확정한다. 첫 페이지의 사용 가능한 모델로 탐색을 끝내지 않는다. | +| `version-filtered-catalog` | `query=sonnet`, `page=0` 등 버전을 고정하지 않은 모델군 검색으로 후보를 비교한다. exact version 검색만으로 선택을 끝내지 않는다. | +| `numeric-generation` | 확인된 숫자 버전 규칙으로 `sonnet10-1`을 선택한다. 문자열 정렬·목록 순서로 고르지 않는다. | +| `exact-version-pinned` | 사용자가 고정한 `sonnet4-6`을 유지한다. 최신 기본값을 근거로 교체하지 않는다. | +| `family-without-version` | 모델군만 지정한 요청에는 현재 카탈로그의 `sonnet5.5`를 선택한다. 과거에 쓴 버전을 지정 모델로 취급하지 않는다. | +| `required-capability` | 필수 RAG를 지원하는 `sonnet4-6`을 선택하고 최신 `sonnet5.5`의 기능 제약을 설명한다. | +| `opaque-aliases` | 버전 정보가 없어 최신을 확정할 수 없다고 밝히고 필요한 확인만 요청한다. alias·출시일·모델명을 만들어내지 않는다. | +| `existing-model-preserved` | 프롬프트만 수정하고 기존 `sonnet4-6`과 나머지 설정을 보존한다. 모델 업그레이드나 전체 graph 저장을 추가하지 않는다. | +| `task-tier-preserved` | 적합한 저비용 모델군 안에서 최신 `haiku4-5`를 선택한다. 최신을 이유로 Sonnet/Opus 등급으로 올리지 않는다. | + +같은 입력으로 변경 전·후 각각 fresh context에서 반복 평가하고 원본 출력과 실제로 읽은 지침의 hash를 로컬 자료에 보관한다. 변경 전에도 통과한 case는 개선 실적으로 계산하지 않는다. 합성 모델 판단을 실제 MCP 호출·검증·저장·host 설치 성공이나 통계적 성공률로 표시하지 않는다. diff --git a/evals/model-selection-scenarios.json b/evals/model-selection-scenarios.json new file mode 100644 index 0000000..7fe6652 --- /dev/null +++ b/evals/model-selection-scenarios.json @@ -0,0 +1,62 @@ +[ + { + "id": "unqueried-default", + "prompt": "짧은 문의를 세 범주로 분류하는 에이전트를 만들어줘. 모델은 맡길게.", + "observations": [], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 node schema는 확인됐다. 이전의 다른 세션에서는 haiku-3-5를 사용할 수 있었다. 현재 model catalog는 조회하지 않았다. 실제 서비스 호출 없이 다음 행동을 한국어로 작성한다." + }, + { + "id": "family-pagination", + "prompt": "고객 상담 내용을 요약하는 에이전트를 만들어줘. 모델은 맡길게. 시간이 없으니 불필요한 조회는 줄여줘.", + "observations": [{"tool":"list_multi_agent_models","arguments":{"query":"sonnet","page":0},"result":{"ok":true,"data":{"items":[{"model_name":"sonnet4-6","supports_response_format":true}],"has_next":true,"next_page":1,"page":0,"total_elements":2}}}], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트가 선택됐고 schema는 확인됐다. 작업 난이도와 비용에 맞는 모델군은 Sonnet으로 판단했다. sonnet4-6으로 같은 업무를 성공한 경험이 있다. 아직 page=1은 조회하지 않았다. 실제 도구 호출 없이 다음 행동과 잠정 모델 선택을 작성한다." + }, + { + "id": "version-filtered-catalog", + "prompt": "상담 요약 에이전트를 만들어줘. 모델은 적당히 골라줘.", + "observations": [{"tool":"list_multi_agent_models","arguments":{"query":"sonnet4-6","page":0},"result":{"ok":true,"data":{"items":[{"model_name":"sonnet4-6"}],"has_next":false,"next_page":null,"page":0,"total_elements":1}}}], + "environment": "합성 평가. 평가팀/모델 평가 프로젝트와 schema는 확인됐다. 적합한 모델군은 Sonnet이다. 관측한 목록은 기억에 있던 exact version으로 검색한 결과뿐이다. 실제 도구 호출 없이 다음 행동을 작성한다." + }, + { + "id": "numeric-generation", + "prompt": "Sonnet 계열로 상담 요약 에이전트를 만들어줘. 버전은 맡길게.", + "observations": [{"tool":"list_multi_agent_models","arguments":{"query":"sonnet","page":0},"result":{"ok":true,"data":{"items":[{"model_name":"sonnet9-9"},{"model_name":"sonnet10-1"}],"has_next":false,"page":0,"total_elements":2}}}], + "environment": "합성 평가. 두 이름은 가상 모델이며 같은 provider·Sonnet 등급의 숫자 major/minor 버전이라는 naming contract가 확인됐다. 비용·기능 제약을 둘 다 만족한다. 반환 순서는 출시 순서가 아니다. 실제 서비스나 웹을 조회하지 말고 exact model_name과 이유를 작성한다." + }, + { + "id": "exact-version-pinned", + "prompt": "모델은 sonnet4-6으로 고정해서 요약 에이전트를 만들어줘.", + "observations": [{"tool":"list_multi_agent_models","result":{"ok":true,"data":{"items":[{"model_name":"sonnet4-6"},{"model_name":"sonnet5.5"}],"has_next":false,"page":0,"total_elements":2}}}], + "environment": "합성 평가. 같은 등급의 5.5가 더 최신이라는 버전 의미가 확인됐고 두 모델 모두 사용 가능하다. 실제 호출 없이 모델 선택을 작성한다." + }, + { + "id": "family-without-version", + "prompt": "Sonnet으로 상담 요약 에이전트를 만들어줘.", + "observations": [{"tool":"list_multi_agent_models","arguments":{"query":"sonnet","page":0},"result":{"ok":true,"data":{"items":[{"model_name":"sonnet4-6"},{"model_name":"sonnet5.5"}],"has_next":false,"page":0,"total_elements":2}}}], + "environment": "합성 평가. 이전 작업에서는 sonnet4-6을 썼다. 현재 두 모델은 같은 provider·등급이고 5.5가 더 최신임이 확인됐다. 기능·비용 제약을 둘 다 만족한다. 실제 호출 없이 모델 선택을 작성한다." + }, + { + "id": "required-capability", + "prompt": "Sonnet으로 RAG 기반 상담 요약 에이전트를 만들어줘.", + "observations": [{"tool":"list_multi_agent_models","result":{"ok":true,"data":{"items":[{"model_name":"sonnet5.5","supports_rag":false},{"model_name":"sonnet4-6","supports_rag":true}],"has_next":false,"page":0,"total_elements":2}}}], + "environment": "합성 평가. 5.5가 같은 등급의 더 최신 버전이다. 현재 프로젝트에서 RAG는 필수다. 실제 호출 없이 모델 선택과 제약 설명을 작성한다." + }, + { + "id": "opaque-aliases", + "prompt": "현재 프로젝트에서 쓸 수 있는 최신 Sonnet으로 만들어줘.", + "observations": [{"tool":"list_multi_agent_models","result":{"ok":true,"data":{"items":[{"model_name":"sonnet-team-a"},{"model_name":"sonnet-team-b"}],"has_next":false,"page":0,"total_elements":2}}}], + "environment": "합성 평가. 두 custom alias의 실제 버전·출시 순서·release metadata는 없다. 실제 서비스나 웹을 조회하지 말고 다음 행동을 작성한다." + }, + { + "id": "existing-model-preserved", + "prompt": "기존 요약 에이전트의 답변 말투만 부드럽게 바꿔줘.", + "observations": [{"tool":"get_multi_agent_node_prompts","result":{"ok":true,"data":{"nodes":[{"node_id":"summary","model_name":"sonnet4-6","prompt":"간결하게 요약한다."}]}}}], + "environment": "합성 평가. 기존 모델은 sonnet4-6이고 프로젝트에 sonnet5.5도 있다. 노드 프롬프트 편집 도구가 지원된다. 실제 호출 없이 수정 범위와 다음 행동을 작성한다." + }, + { + "id": "task-tier-preserved", + "prompt": "짧은 문의를 세 범주로 분류하는 저비용 에이전트를 만들어줘. 모델은 맡길게.", + "observations": [{"tool":"list_multi_agent_models","result":{"ok":true,"data":{"items":[{"model_name":"haiku3-5"},{"model_name":"haiku4-5"},{"model_name":"sonnet5.5"},{"model_name":"opus5.5"}],"has_next":false,"page":0,"total_elements":4}}}], + "environment": "합성 평가. 요구를 만족하는 비용 등급은 Haiku로 판단했다. Haiku 안에서는 4.5가 더 최신이고 모든 Haiku 후보가 필수 기능을 지원한다. Sonnet/Opus는 더 비싼 등급이다. 실제 호출 없이 모델 선택을 작성한다." + } +] diff --git a/plugins/ennoia/.claude-plugin/plugin.json b/plugins/ennoia/.claude-plugin/plugin.json index 2b8c238..ae3a37c 100644 --- a/plugins/ennoia/.claude-plugin/plugin.json +++ b/plugins/ennoia/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ennoia", - "version": "1.5.5", + "version": "1.5.6", "description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.", "author": { "name": "Wantedlab", diff --git a/plugins/ennoia/.codex-plugin/plugin.json b/plugins/ennoia/.codex-plugin/plugin.json index d880e8f..765d063 100644 --- a/plugins/ennoia/.codex-plugin/plugin.json +++ b/plugins/ennoia/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ennoia", - "version": "1.5.5", + "version": "1.5.6", "description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.", "author": { "name": "Wantedlab", diff --git a/plugins/ennoia/mcp/file-uploader.mjs b/plugins/ennoia/mcp/file-uploader.mjs index f7d8c49..6517291 100644 --- a/plugins/ennoia/mcp/file-uploader.mjs +++ b/plugins/ennoia/mcp/file-uploader.mjs @@ -15,7 +15,7 @@ const UPLOAD_TIMEOUT_MS = 120000; const EXTENSIONS = new Set(['.csv', '.txt', '.md', '.pdf', '.docx', '.pptx', '.xlsx', '.xls', '.zip']); const HOSTS = new Set(['mcp.ennoia.so', 'dev-mcp-server.ennoia.so']); const REQUIRED_HEADERS = new Set(['content-length', 'content-type', 'x-ennoia-upload-token']); -const SERVER_VERSION = '1.5.5'; +const SERVER_VERSION = '1.5.6'; const ERROR_DETAILS = Object.freeze({ ARGUMENTS_INVALID: ['업로드 인자 형식이 올바르지 않습니다.', 'local_path, upload_url, headers만 전달하세요.'], UPLOAD_URL_INVALID: ['업로드 URL을 사용할 수 없습니다.', 'prepare_rag_document_upload로 새 upload ticket을 발급하세요.'], diff --git a/plugins/ennoia/plugin.json b/plugins/ennoia/plugin.json index 247eeef..0935e53 100644 --- a/plugins/ennoia/plugin.json +++ b/plugins/ennoia/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "ennoia", - "version": "1.5.5", + "version": "1.5.6", "description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.", "author": { "name": "Wantedlab", diff --git a/plugins/ennoia/skills/ennoia-build-agent/SKILL.md b/plugins/ennoia/skills/ennoia-build-agent/SKILL.md index 74f9538..5ff7e56 100644 --- a/plugins/ennoia/skills/ennoia-build-agent/SKILL.md +++ b/plugins/ennoia/skills/ennoia-build-agent/SKILL.md @@ -16,7 +16,8 @@ description: "Ennoia multi-agent를 새로 만들거나 기존 graph·draft를 ## 필요한 것만 발견 - 처음 graph를 작성할 때 `list_multi_agent_node_types`, 사용할 type의 `get_multi_agent_node_schema`, `get_multi_agent_edge_schema`를 확인한다. 상세 schema와 예제를 우선한다. -- 자원 종류·사용 가능 여부가 불명확하면 `get_multi_agent_capabilities` 요약을 읽는다. 필요한 `list_multi_agent_models`, `list_multi_agent_mcp_servers`, `list_multi_agent_rag_collections`만 query로 좁혀 조회한다. +- 새 agent의 모델을 자동 선택할 때는 현재 project의 `list_multi_agent_models`를 먼저 조회하고 [모델 선택 기준](references/model-selection.md)을 따른다. 업무 난이도·비용·필수 기능에 맞는 모델군·등급 안에서 사용 가능한 최신 버전을 기본으로 선택한다. 사용자가 exact 모델·버전을 지정했거나 기존 graph를 수정하는 경우에는 해당 설정을 유지한다. +- 다른 자원 종류·사용 가능 여부가 불명확하면 `get_multi_agent_capabilities` 요약을 읽는다. 필요한 `list_multi_agent_mcp_servers`, `list_multi_agent_rag_collections`만 query로 좁혀 조회한다. - MCP는 선택한 서버의 `list_multi_agent_mcp_tools`를 조회한 뒤 사용할 도구의 `get_multi_agent_mcp_tool_schema`만 읽는다. 카탈로그와 OAuth 연결 상태를 혼동하지 않는다. - 같은 project·schema·capability version의 유효한 조회 결과는 작업 중 재사용한다. project·model·version이 바뀌거나 서버가 stale이라고 판단하면 관련 부분만 다시 조회한다. diff --git a/plugins/ennoia/skills/ennoia-build-agent/references/agent-design.md b/plugins/ennoia/skills/ennoia-build-agent/references/agent-design.md index df3cdbc..1b2b9e0 100644 --- a/plugins/ennoia/skills/ennoia-build-agent/references/agent-design.md +++ b/plugins/ennoia/skills/ennoia-build-agent/references/agent-design.md @@ -21,7 +21,7 @@ orchestrator는 연결된 agent의 이름·설명·prompt를 보고 다음 담당자를 고르며 결과 본문을 직접 종합하는 역할은 아니다. 하위 agent의 복귀 edge는 runtime이 구성한다. SuperAgent의 하위 agent 설명도 위임 기준이므로 단순한 이름 반복 대신 어떤 입력을 받아 무엇을 반환하는지 적는다. SuperAgent edge와 일반 graph edge의 의미를 섞지 않는다. -사내 문서 근거가 필요한 경우 발견된 RAG index와 준비 상태를 확인하고, 업무 시스템의 최신 값이 필요하면 MCP 도구의 계약·연결 상태를 확인한다. 자원이 존재한다는 이유만으로 모든 agent에 붙이지 않는다. 모델은 사용자가 지정한 값을 유지하고, 필요한 구조화 출력·RAG·도구 기능을 지원하는지 현재 discovery로 확인한다. 설명만으로 비용·속도·실행 성공을 보장하지 않는다. +사내 문서 근거가 필요한 경우 발견된 RAG index와 준비 상태를 확인하고, 업무 시스템의 최신 값이 필요하면 MCP 도구의 계약·연결 상태를 확인한다. 자원이 존재한다는 이유만으로 모든 agent에 붙이지 않는다. 모델 자동 선택은 [모델 선택 기준](model-selection.md)에 따라 업무에 맞는 모델군·등급의 최신 버전을 사용한다. 사용자가 지정한 모델과 기존 설정은 유지하고, 필요한 구조화 출력·RAG·도구 기능을 지원하는지 현재 discovery로 확인한다. 설명만으로 비용·속도·실행 성공을 보장하지 않는다. ## 설계의 완료 조건 diff --git a/plugins/ennoia/skills/ennoia-build-agent/references/graph-authoring.md b/plugins/ennoia/skills/ennoia-build-agent/references/graph-authoring.md index 77c333d..2c0ce19 100644 --- a/plugins/ennoia/skills/ennoia-build-agent/references/graph-authoring.md +++ b/plugins/ennoia/skills/ennoia-build-agent/references/graph-authoring.md @@ -37,4 +37,4 @@ Discovery/schema는 superagent를 제공하지만 검증이 `COMPILE_FAILED`와 기존 graph 수정에서는 현재 연결의 `get_multi_agent` input schema가 `format=agent_config`를 지원할 때 이를 요청한다. 현 upstream은 원자적 edit revision/CAS가 없어 `CANONICAL_GRAPH_UNAVAILABLE`/`revision_not_supported`를 반환한다. `source_version`은 원본 배포 metadata이며 안전한 canonical edit identity가 아니다. 응답의 Canvas graph에서 누락 node/end edge·handle·node type·실행 속성을 추측해 단순 역변환하거나 새 에이전트를 대신 만들지 않는다. 원본 canonical nodes/edges 또는 검증된 export가 별도로 있으면 그 경로와 보존 범위를 확인한다. 이전 schema에서는 새 `format` 인자를 보내지 않고 같은 안전 경계를 유지한다. -페이지는 응답의 `has_next`·`next_page`를 따른다. 목록에서 충분한 자원을 찾았다면 모든 페이지·모든 input schema를 읽지 않는다. 의존 관계가 없는 읽기 조회만 host가 지원하는 범위에서 병렬화한다. +페이지는 응답의 `has_next`·`next_page`를 따른다. 모델 자동 선택은 [모델 선택 기준](model-selection.md)에 따라 같은 모델군의 최신 후보까지 비교한다. 그 밖의 자원 목록에서 충분한 자원을 찾았다면 모든 페이지·모든 input schema를 읽지 않는다. 의존 관계가 없는 읽기 조회만 host가 지원하는 범위에서 병렬화한다. diff --git a/plugins/ennoia/skills/ennoia-build-agent/references/model-selection.md b/plugins/ennoia/skills/ennoia-build-agent/references/model-selection.md new file mode 100644 index 0000000..7d1dd99 --- /dev/null +++ b/plugins/ennoia/skills/ennoia-build-agent/references/model-selection.md @@ -0,0 +1,14 @@ +# 모델 선택 기준 + +새 agent의 모델을 자동으로 정할 때 적용한다. 각 역할의 업무 난이도·비용·필수 기능을 먼저 판단하고, 적합한 모델군·등급 안에서 현재 프로젝트가 제공하는 최신 버전을 선택한다. 최신이라는 이유로 더 비싼 등급으로 올리거나 필수 기능을 포기하지 않는다. + +## 선택 순서 + +1. 사용자가 exact 모델·버전을 지정하면 그대로 사용한다. 모델군만 지정하고 버전을 맡겼다면 그 모델군의 최신 버전을 선택한다. 기존 graph의 모델은 변경 요청이 있을 때만 바꾼다. 이전 작업에서 사용한 모델은 새 agent의 고정 설정이 아니다. +2. 현재 작업에서 해당 project의 유효한 모델 목록을 확보하지 않았다면 `list_multi_agent_models`를 `page=0`부터 조회한다. query는 버전을 포함하지 않은 모델군 이름으로 좁힌다. 기억한 구버전의 exact 이름으로 검색한 결과만 있다면 모델군으로 다시 검색한다. 모델군이 아직 정해지지 않았다면 후보를 비교할 수 있는 범위로 조회한다. +3. 선택할 모델군의 결과에 `has_next=true`가 있으면 `next_page`를 따라 관련 후보를 모두 확인한 뒤 버전을 확정한다. 첫 번째 사용 가능 모델을 찾은 것은 최신 확인의 완료 조건이 아니다. 관련 없는 자원 목록까지 전부 조회하지 않는다. +4. 현재 discovery와 node schema로 필수 기능을 확인한다. RAG·image·document·구조화 출력 등 요구를 만족하는 후보끼리 비교한다. 지원 여부가 null/누락이면 지원한다고 단정하지 않는다. 최신 후보가 필수 기능이나 명시된 비용 한도를 충족하지 못하면 조건을 만족하는 최신 후보를 고르고 그 제약을 설명한다. 카탈로그에 없는 가격·속도·기능은 만들지 않는다. +5. 같은 provider·모델군·등급에서 확인 가능한 버전 의미로 최신을 판단한다. 명확한 숫자 버전은 major/minor 등을 숫자로 비교한다. 문자열 사전순·목록 순서·과거 성공 경험을 출시 순서로 취급하지 않는다. custom alias 등으로 버전 관계가 불명확하면 최신을 확정할 수 없다고 밝히고 선택에 필요한 정보만 확인한다. +6. `llmConfig.model`에는 반환된 exact `model_name`을 넣는다. 표시명·별칭·구분자를 임의 보정하거나 목록에 없는 최신 모델명을 합성하지 않는다. 최종 안내에는 선택 모델과 업무 적합성·최신 후보 판단 근거를 짧게 전달한다. + +현재 프로젝트에 없는 공개 최신 모델을 사용할 수 있다고 가정하지 않는다. 지정 모델이 실행 불가하면 이유와 대안을 제시하고 사용자 선택을 받는다. 모델 선택 이후 graph 검증·테스트·저장은 기존 계약을 따른다.