Commit Graph

66 Commits

Author SHA1 Message Date
21in7
90a0ada6ff feat: Ollama migration — GLM API → local Ollama, blueprint system, RCON optimization 2026-03-27 00:04:16 +09:00
21in7
21cc94bc87 chore: update startup banner to show Ollama model and host 2026-03-27 00:03:18 +09:00
21in7
dfa4ab1f30 perf: reduce RCON polling in move/explore loops from 0.1s to 0.3s 2026-03-27 00:02:43 +09:00
21in7
e92efc7bdf feat: add build_smelting_line blueprint action to ActionExecutor 2026-03-27 00:01:59 +09:00
21in7
2212dda22f feat: replace GLM API with local Ollama structured output, remove ~400 lines of JSON repair code 2026-03-27 00:00:19 +09:00
21in7
3e2ce49f47 chore: add ollama dependency 2026-03-26 23:57:06 +09:00
21in7
9a9acc07b8 chore: ignore .worktrees directory 2026-03-26 23:53:14 +09:00
kswdev0
084c17418a fix: AIPlanner에서 finish_reason 처리 및 휴리스틱 폴백 로직 개선
- 응답의 finish_reason이 'length'이고 비JSON 텍스트가 포함된 경우, 즉시 상태 기반 휴리스틱 폴백으로 전환하는 로직 추가
- AIPlanner 클래스에 _last_glm_finish_reason 속성을 추가하여 이전 finish_reason을 추적
- README.md에 변경 사항 반영
2026-03-26 13:08:38 +09:00
kswdev0
9d3c7176d3 fix: AIPlanner JSON-only repair 및 빈 actions 처리 개선
- JSON-only repair를 한 번 적용했음에도 비JSON 텍스트가 계속 오는 경우, 즉시 상태 기반 휴리스틱 폴백으로 전환하는 로직 추가
- LLM이 빈 actions를 반환할 경우에도 즉시 휴리스틱 플랜으로 대체하여 진행을 유지하도록 개선
- README.md에 변경 사항 반영
2026-03-26 13:00:02 +09:00
kswdev0
64cd08297b fix: AIPlanner JSON-only repair 프롬프트 및 max_tokens 조정
- JSON-only repair 프롬프트의 내용을 간소화하여 명확한 요구사항을 전달하도록 수정
- 재시도 시 max_tokens를 250으로 줄이고, temperature를 0.0으로 설정하여 JSON 포맷 준수율을 높임
- README.md에 변경 사항 반영
2026-03-26 12:56:56 +09:00
kswdev0
9634362002 fix: AIPlanner에서 GLM 모델 버전 변경 및 JSON 응답 처리 개선
- GLM 모델 버전을 "GLM-4.7"에서 "GLM-4.5-Air"로 변경
- JSON 응답 처리 시, 재시도 시 max_tokens 및 temperature 조정 로직 추가하여 JSON 포맷 준수율 향상
- README.md에 변경 사항 반영
2026-03-26 12:54:59 +09:00
kswdev0
146e6b3982 fix: AIPlanner에서 HTTP 429 오류 처리 및 재시도 로직 개선
- GLM API에서 HTTP 429 (Rate limit) 오류 발생 시, 'Retry-After' 헤더를 확인하여 적절한 대기 시간을 설정하도록 로직 추가
- 재시도 시 기본 백오프 대신 'Retry-After' 값이 있을 경우 이를 우선 적용하여 대기 시간 조정
- README.md에 변경 사항 반영
2026-03-26 12:51:40 +09:00
kswdev0
c30fb426a8 fix: AIPlanner JSON 출력 요구사항 및 max_tokens 조정
- JSON 출력 요구사항을 명확히 하여 응답의 첫 비공백 문자가 반드시 `{` 이어야 함을 추가
- 재시도 시 max_tokens를 줄여 JSON 잘림 문제를 완화하는 로직 추가
- README.md에 변경 사항 반영
2026-03-26 11:58:08 +09:00
kswdev0
6e5f781529 feat: AIPlanner에서 건설 전 이동 보장 로직 추가
- `_ensure_move_before_build_actions` 메서드를 추가하여, LLM이 "move" 후 "place_entity"/"insert_to_entity"/"set_recipe" 순서를 놓치는 경우를 방지
- 최근 이동 좌표와 비교하여 필요 시 자동으로 이동 액션을 삽입하는 로직 구현
- 관련 단위 테스트 추가 및 README.md에 변경 사항 반영
2026-03-26 11:56:33 +09:00
kswdev0
e0ca8f7b52 feat: GLM 디버그 정보 출력 개선
- `_glm_debug_enabled()`가 활성화된 경우, JSON 응답에서 `finish_reason`을 출력하도록 로직 추가하여 디버깅 정보 강화
- 디버그 출력에 대한 가독성을 높여 문제 해결 시 유용한 정보 제공
2026-03-26 11:52:31 +09:00
kswdev0
3e90090b5e feat: AIPlanner JSON 파싱 실패 시 재시도 로직 개선
- JSON 파싱 실패 감지 시, 다음 재시도에 `JSON-only repair` 프롬프트를 추가하여 모델이 스키마를 준수하도록 유도하는 로직을 구현
- README.md에 JSON 파싱 실패 처리 및 재시도 로직에 대한 설명 추가
2026-03-26 11:48:44 +09:00
kswdev0
ace5d63480 feat: AIPlanner JSON 파싱 로직 개선 및 다중 JSON 객체 처리 추가
- `_parse_json()` 메서드에서 응답 내 여러 JSON 객체 중 `actions`를 포함한 계획 객체를 우선 선택하도록 로직 개선
- JSON 파싱 실패 시 잘림 복구 로직을 추가하여 안정성 향상
- 관련 단위 테스트 추가 및 README.md에 변경 사항 반영
2026-03-26 11:36:45 +09:00
kswdev0
db08db62a3 feat: GLM 디버그 정보 출력 추가
- `_glm_debug_enabled()`가 활성화된 경우, content와 reasoning의 길이 및 JSON 유사성 여부를 포함한 디버그 정보를 출력하도록 로직 추가
- 디버깅을 위한 content 및 reasoning의 미리보기 문자열도 포함하여 문제 해결 시 유용한 정보 제공
2026-03-26 11:20:12 +09:00
kswdev0
7353226603 feat: AIPlanner의 GLM 응답 처리 로직 개선
- content가 비어있거나 JSON 형태가 아닐 경우 reasoning_content를 우선 사용하도록 로직 개선
- JSON 유사성을 판단하는 헬퍼 함수 추가 및 기존 동작 유지
- 관련 단위 테스트 추가 및 README.md에 변경 사항 반영
2026-03-26 11:17:34 +09:00
kswdev0
a2648f9095 feat: GLM 응답에서 assistant 텍스트 추출 로직 개선 및 관련 경고 메시지 추가
- GLM 응답의 content가 비어있을 경우 reasoning_content를 대신 사용하도록 로직 개선
- 새로운 메서드 _extract_glm_assistant_text 추가하여 assistant 텍스트 추출을 명확히 함
- 관련 단위 테스트 추가 및 README.md에 변경 사항 반영
2026-03-26 11:11:24 +09:00
kswdev0
b014df06b8 feat: GLM 응답 content 비어있을 때 경고 메시지 추가 및 JSON 파싱 실패 처리 개선
- GLM 응답의 content가 비어있을 경우 경고 메시지를 출력하도록 로직 추가
- JSON 파싱 시 raw가 비어있을 경우 ValueError를 발생시켜 오류 처리를 강화
- 관련 문서 및 README.md에 변경 사항 반영
2026-03-26 11:04:38 +09:00
kswdev0
0a46e16e5b feat: JSON 배열 처리 및 오류 메시지 개선
- `_parse_json()` 메서드에서 최상위 JSON 배열을 허용하고, 이를 `actions` 리스트로 래핑하여 정상적인 파이프라인으로 이어지도록 개선
- JSON 파싱 실패 시 원인 파악을 돕기 위해 오류 메시지에 첫 비공백 문자를 포함
- 새로운 단위 테스트를 추가하여 JSON 객체 및 배열 파서의 회귀 방지
- README.md 및 문서에 변경 사항 반영
2026-03-26 10:57:25 +09:00
kswdev0
153f02f5e9 feat: 메모리 섹션 추가 및 상태 요약 개선
- `_append_memory_sections` 함수를 추가하여 압축 모드에서 기억된 광맥과 마지막 행동 정보를 상태 요약에 포함하도록 개선
- `main.py`에서 상태 요약 생성 시 메모리 섹션을 자동으로 추가하여 AI의 의사결정에 필요한 정보를 제공
- `README.md`에 새로운 메모리 기능 및 사용 방법에 대한 설명 추가
- `state_reader.py`에서 인벤토리 판독 로직을 개선하여 캐시 사용 조건을 명확히 하여 안정성 향상
2026-03-26 10:45:30 +09:00
kswdev0
3d118fe649 feat: mining_state 설정 최적화 및 GLM 예외 처리 개선
- `mine_resource` 함수에서 채굴 상태를 매 루프마다 반복 설정하던 로직을 제거하여, 우클릭 유지와 유사한 동작으로 최적화
- GLM API 호출 실패 시 예외 처리 로직을 개선하여, 다양한 오류 원인을 로그로 출력하고 상태 요약 기반의 폴백 로직 추가
- 새로운 연결 검사 스크립트 추가 및 README.md에 GLM API 연결 문제 디버깅 섹션 추가
- 관련 문서 및 주의사항 업데이트
2026-03-26 09:49:47 +09:00
21in7
abd388fc1e feat: 배치 엔티티 재사용 로직 개선 및 README 업데이트
- `place_entity` 함수에서 인벤토리 아이템 유무를 확인하기 전에 기존 엔티티를 탐색하여 재사용(`REUSED`) 처리하도록 로직 개선
- 요청 좌표 주변 `±1 타일` 및 반경 `3` 타일 내에서 기존 엔티티를 찾아 재사용할 수 있도록 확장
- `stone-furnace`의 재사용 시 자동 부트스트랩 기능이 정상 작동하도록 보장
- README.md에 변경 사항 및 새로운 동작 설명 추가
- `tests/test_place_entity_reuse.py`에 대한 단위 테스트 추가
2026-03-26 00:36:05 +09:00
21in7
9b3d26aa12 feat: 자동 부트스트랩 기능 추가 및 인벤토리 검사 개선
- `stone-furnace` 배치 후 자동으로 `coal`과 `iron-ore`/`copper-ore`를 투입하여 제련이 시작되도록 보정하는 기능 추가
- `insert_to_entity` 호출 전에 `can_insert` 여부를 확인하여 아이템 증발 위험을 줄이는 로직 개선
- `README.md`에 새로운 기능 설명 추가
- `tests/test_furnace_bootstrap.py` 및 `tests/test_insert_to_entity.py`에 대한 단위 테스트 추가
2026-03-26 00:00:54 +09:00
21in7
25eaa7f6cd feat: 추가된 메모리 기능으로 광맥 및 마지막 행동 저장
- 에이전트가 발견한 광맥 좌표를 `ore_patch_memory.json`에 저장하여 재시작 시 활용 가능
- 마지막 실행한 행동과 결과를 `agent_last_action_memory.json`에 저장하여 다음 상태 요약에서 참고 가능
- `state_reader.py`에서 메모리 로드 및 상태 요약에 포함
- `ai_planner.py`에서 시스템 프롬프트에 기억된 광맥 및 마지막 행동 관련 가이드 추가
- `README.md`에 새로운 메모리 기능 설명 추가
2026-03-25 23:34:25 +09:00
21in7
8c90e80582 feat: 인벤토리 캐시 및 JSON 인코더 추가
- 인벤토리 캐시 기능을 추가하여, RCON으로 인벤토리를 읽지 못할 경우 이전에 성공적으로 읽은 데이터를 활용
- Lua에서 JSON 인코딩을 위한 간단한 함수 추가, 일부 Factorio 버전에서 `game.table_to_json`이 없을 경우 대체
- `README.md`에 인벤토리 캐시 및 JSON 인코더 사용에 대한 설명 추가
- `scan_resources()`와 `mine_resource`의 반경을 확장하여 자원 탐색 실패를 줄임
2026-03-25 23:03:08 +09:00
21in7
e98d08bb44 fix: 개선된 인벤토리 판독 로직으로 안정성 향상
- 인벤토리 판독 시 `inv.get_contents()`를 우선 사용하여 일부 환경에서 발생할 수 있는 오류를 줄임
- 이전 방식인 인덱스 접근 방식은 호환성 문제를 해결하기 위한 폴백으로 유지
- README.md에 변경 사항 반영
2026-03-25 21:56:26 +09:00
21in7
37127f7f4f feat: explore 메서드에 wanted_ores 매개변수 추가 및 로직 개선
- explore 메서드에 wanted_ores 매개변수를 추가하여 특정 자원을 찾을 수 있도록 개선
- 원하는 자원이 발견될 때까지 계속 이동하며, 다른 자원이 발견되더라도 즉시 멈추지 않도록 로직 수정
- 시스템 프롬프트 및 README.md에 변경 사항 반영
2026-03-25 21:51:37 +09:00
21in7
7abdf8713a fix: mine_resource 채굴 로직 개선 및 JSON 파싱 안정성 향상
- 광석 위치로 이동 후 실제 자원 존재 여부를 재확인하여 실패한 타일을 제외하는 로직 추가
- JSON 파싱 시 중괄호 및 대괄호 균형을 추적하고, 잘린 응답 복구 로직을 개선하여 안정성 향상
- README.md에 변경 사항 및 기능 설명 추가
2026-03-25 21:37:15 +09:00
21in7
9a2185ca4b fix: 실패한 타일 제외 2026-03-25 21:24:13 +09:00
21in7
c99ca1e43c fix: 실패한 타일 제외 2026-03-25 21:20:20 +09:00
bc7bb4d1e6 fix: mine_resource 실패한 타일 좌표 기억 + Lua에서 제외
근본 원인: 매번 같은 타일(388,2)을 찾아서 무한 반복
수정:
1. Python에서 failed_positions set() 유지
2. Lua에 exclude 테이블 전달 → 실패한 좌표 건너뛰기
3. 접근 불가 타일은 즉시 제외 목록에 추가
4. 고갈된 타일도 제외
5. 최대 15개 다른 타일 순서대로 시도
6. ALL_EXCLUDED 시 명확한 메시지 반환
2026-03-25 20:59:03 +09:00
1c5c0e0a5a fix: mine_resource 근본 수정 — 광석 타일로 먼저 걸어간 뒤 채굴
근본 원인: mining_state는 2.7타일 이내만 채굴 가능
이전: 반경 50에서 찾고 제자리에서 채굴 시도 → 손이 안 닿아 실패
이후:
1. 반경 80에서 가장 가까운 광석 찾기
2. 그 광석 타일 좌표로 move (걸어가기)
3. 도착 후 mining_state로 채굴
4. 타일 고갈/접근불가 시 다음 가까운 타일로 자동 이동
5. 최대 10라운드(이동+채굴) 반복
2026-03-25 20:51:43 +09:00
d27aff2824 fix: mine_resource 접근 불가 시 광맥 주변 8방향 이동 후 재시도
이전: 같은 위치에서 5개 타일만 시도 → 절벽이면 전부 실패
이후:
1. 현재 위치에서 반경 50, 10개 타일 시도
2. 실패 → 광맥 중심 주변 8방향(±10~15칸)으로 이동
3. 새 위치에서 다시 10개 타일 시도
4. 총 9개 위치 × 10개 타일 = 최대 90번 시도
5. 부분 채굴도 성공으로 반환
2026-03-25 20:49:07 +09:00
8575cf4f76 fix: mine_resource 채굴 안 되면 다른 타일 자동 전환
- Lua에서 가장 가까운 광석 5개를 거리순으로 반환
- 매 10틱마다 진행 체크 (아이템 수 변화 확인)
- 3번 연속 진행 없으면 → 다음 타일로 자동 전환
- 최대 5개 타일 순서대로 시도
- 절벽/장애물 때문에 못 닿는 타일은 빠르게 스킵
2026-03-25 20:41:41 +09:00
b58e30d3f6 fix: /c → /silent-command (게임 콘솔 스팸 방지)
/c는 모든 명령을 게임 콘솔에 표시함
/silent-command는 동일하게 동작하되 콘솔에 표시 안 함
2026-03-25 20:36:25 +09:00
root
7953047212 fix: GLM 모델명 수정 2026-03-25 20:33:16 +09:00
63e9add1dd feat: explore 액션을 시스템 프롬프트에 추가
- explore를 최우선 탐색 액션으로 안내
- move는 "좌표를 알 때만" 사용하도록 변경
- fallback 행동도 move→explore로 변경
- 방향별 순서 안내 (east→north→south→west)
2026-03-25 20:27:27 +09:00
86af860267 feat: explore 액션 추가 - 걸으면서 자원 스캔, 발견 시 즉시 멈춤
- explore(direction, max_steps): 8방향 걷기 + 매 20틱마다 반경 50 자원 스캔
- 자원 발견 → 즉시 멈추고 위치 + 자원 종류/수량 반환
- 장애물 stuck 감지 → "다른 방향 시도" 메시지
- insert_to_entity: area 대신 position+radius (중괄호 충돌 방지)
2026-03-25 20:24:42 +09:00
47cc692d96 fix: f-string 제거 + position/radius + pcall + 인덱스 인벤토리
- _get_global_summary: position+radius, pcall
- _get_zone_summaries: f-string 제거, pcall
- _detect_problems: position+radius, pcall
- _get_player_info: get_contents() → 인덱스 접근 (Factorio 2.0 호환)
- 모든 함수 try/except + startswith 검증
2026-03-25 20:21:47 +09:00
ba013bf461 fix: f-string 완전 제거 + position/radius 방식 + pcall + try/except
근본 원인: f-string 안의 Lua {{}} 중괄호가 Python 이스케이프와 충돌
- scan_resources: area 대신 position+radius (중첩 중괄호 없음)
- 모든 Lua: f-string 제거, pcall 감싸기
- get_inventory: get_contents() 대신 인덱스 접근 (Factorio 2.0 호환)
- get_buildings: force="player"로 간결하게
- 모든 Python 파싱: try/except + startswith("{") 검증
2026-03-25 20:20:47 +09:00
12dba24965 fix: Factorio 2.0 호환 - type 기반 검색 + pcall 안전 감싸기
- _get_global_summary: name 기반→type 기반 검색 (filter-inserter 에러 해결)
- _get_zone_summaries: e.type 기반 분류
- _detect_problems: 전력 부족 체크 제거 (API 변경 대응)
- _get_player_info: 모든 아이템 표시 (하드코딩 목록 제거)
- 모든 검색에 pcall 적용
2026-03-25 20:09:58 +09:00
6ee4fef688 fix: Factorio 2.0 호환 + 자원 스캔 반경 500 + type 기반 검색
- scan_resources: radius 200→500, type="resource"로 검색 (이름 호환 문제 없음)
- get_buildings: name 대신 type 기반 + pcall 안전 감싸기
- summarize_for_ai: 자원 거리 표시 추가
2026-03-25 20:09:02 +09:00
37c71e85c5 fix: SyntaxError - f-string 안의 리터럴 중괄호 수정
f"...'{' 없음..." → "...'{' 없음..." + raw[:300]
f-string 안에서 { 리터럴은 구문 오류를 발생시킴
2026-03-25 15:18:11 +09:00
ce355a2678 fix: 시작 시 플레이어 접속 확인 + RCON 호환
- check_player() 추가: 30초 대기하며 플레이어 접속 안내
- game.players[1] 사용으로 RCON 호환
- 미접속 시 명확한 에러 메시지
2026-03-25 15:12:40 +09:00
954072bfdd fix: context_compressor game.player → game.players[1] 2026-03-25 15:12:07 +09:00
6f220bc3f5 fix: JSON 파싱 강화 + 3회 재시도 + 잘린 응답 복구
- max_tokens 1500→2000 (잘림 방지)
- 중첩 괄호 카운팅 기반 JSON 추출
- _repair_truncated_json() 잘린 응답 복구
- 3회 실패 시 기본 탐색 행동 반환 (크래시 방지)
- 시스템 프롬프트 강화 (순수 JSON 강조)
2026-03-25 15:11:00 +09:00
ea4be446bb fix: state_reader game.player → game.players[1] 2026-03-25 15:09:48 +09:00