process-gpt-agent-sdk 0.4.4__py3-none-any.whl → 0.4.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of process-gpt-agent-sdk might be problematic. Click here for more details.
- {process_gpt_agent_sdk-0.4.4.dist-info → process_gpt_agent_sdk-0.4.5.dist-info}/METADATA +1 -1
- process_gpt_agent_sdk-0.4.5.dist-info/RECORD +9 -0
- processgpt_agent_sdk/__init__.py +44 -44
- processgpt_agent_sdk/database.py +441 -428
- processgpt_agent_sdk/processgpt_agent_framework.py +497 -494
- processgpt_agent_sdk/utils.py +208 -208
- process_gpt_agent_sdk-0.4.4.dist-info/RECORD +0 -9
- {process_gpt_agent_sdk-0.4.4.dist-info → process_gpt_agent_sdk-0.4.5.dist-info}/WHEEL +0 -0
- {process_gpt_agent_sdk-0.4.4.dist-info → process_gpt_agent_sdk-0.4.5.dist-info}/top_level.txt +0 -0
processgpt_agent_sdk/utils.py
CHANGED
|
@@ -1,208 +1,208 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import logging
|
|
3
|
-
import traceback
|
|
4
|
-
from typing import Any, Dict, Optional, List
|
|
5
|
-
from llm_factory import create_llm
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(__name__)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
# ─────────────────────────────
|
|
12
|
-
# Lazy Singleton LLM Client
|
|
13
|
-
# ─────────────────────────────
|
|
14
|
-
_client = None
|
|
15
|
-
_global_agent_model = None
|
|
16
|
-
|
|
17
|
-
def set_agent_model(agent: Optional[Dict[str, Any]]) -> None:
|
|
18
|
-
"""첫 번째 에이전트의 모델을 글로벌 변수에 설정합니다."""
|
|
19
|
-
global _global_agent_model
|
|
20
|
-
|
|
21
|
-
if agent:
|
|
22
|
-
model = agent.get("model")
|
|
23
|
-
if model:
|
|
24
|
-
# "openai/gpt-4o" 형식을 파싱하여 provider와 model 분리
|
|
25
|
-
if "/" in model:
|
|
26
|
-
provider, model_name = model.split("/", 1)
|
|
27
|
-
_global_agent_model = {"provider": provider, "model": model_name}
|
|
28
|
-
logger.info("🤖 글로벌 에이전트 모델 설정: %s/%s", provider, model_name)
|
|
29
|
-
else:
|
|
30
|
-
# 벤더사명이 없으면 모델명만 저장
|
|
31
|
-
_global_agent_model = {"provider": None, "model": model}
|
|
32
|
-
logger.info("🤖 글로벌 에이전트 모델 설정: %s", model)
|
|
33
|
-
else:
|
|
34
|
-
_global_agent_model = None
|
|
35
|
-
logger.info("🤖 에이전트에 모델 정보가 없음")
|
|
36
|
-
else:
|
|
37
|
-
_global_agent_model = None
|
|
38
|
-
logger.info("🤖 에이전트가 없음")
|
|
39
|
-
|
|
40
|
-
def get_agent_model() -> Optional[str]:
|
|
41
|
-
"""글로벌 에이전트 모델 정보를 반환합니다."""
|
|
42
|
-
return _global_agent_model
|
|
43
|
-
|
|
44
|
-
def get_client():
|
|
45
|
-
global _client
|
|
46
|
-
if _client is not None:
|
|
47
|
-
return _client
|
|
48
|
-
|
|
49
|
-
# 글로벌 에이전트 모델로 클라이언트 생성
|
|
50
|
-
agent_model = get_agent_model()
|
|
51
|
-
if agent_model:
|
|
52
|
-
provider = agent_model["provider"]
|
|
53
|
-
model_name = agent_model["model"]
|
|
54
|
-
|
|
55
|
-
if provider:
|
|
56
|
-
# 벤더사가 있으면 provider와 model 모두 전달
|
|
57
|
-
_client = create_llm(provider=provider, model=model_name, temperature=0)
|
|
58
|
-
logger.info("🤖 글로벌 에이전트 모델로 LLM 클라이언트 초기화: %s/%s", provider, model_name)
|
|
59
|
-
else:
|
|
60
|
-
# 벤더사가 없으면 model만 전달
|
|
61
|
-
_client = create_llm(model=model_name, temperature=0)
|
|
62
|
-
logger.info("🤖 글로벌 에이전트 모델로 LLM 클라이언트 초기화: %s", model_name)
|
|
63
|
-
else:
|
|
64
|
-
_client = create_llm(model="gpt-4.1-mini", temperature=0)
|
|
65
|
-
logger.info("🔧 기본 모델로 LLM 클라이언트 초기화: gpt-4.1-mini")
|
|
66
|
-
return _client
|
|
67
|
-
|
|
68
|
-
# ─────────────────────────────
|
|
69
|
-
# 공통 LLM 호출 유틸
|
|
70
|
-
# ─────────────────────────────
|
|
71
|
-
async def _llm_request(system: str, user: str) -> str:
|
|
72
|
-
logger.info("📡 LLM 요청 전송")
|
|
73
|
-
|
|
74
|
-
model = get_client()
|
|
75
|
-
|
|
76
|
-
# llm_factory를 사용한 LLM 호출
|
|
77
|
-
messages = [
|
|
78
|
-
{"role": "system", "content": system},
|
|
79
|
-
{"role": "user", "content": user},
|
|
80
|
-
]
|
|
81
|
-
|
|
82
|
-
response = await model.ainvoke(messages)
|
|
83
|
-
|
|
84
|
-
# 응답에서 텍스트 추출
|
|
85
|
-
if hasattr(response, 'content'):
|
|
86
|
-
text = response.content
|
|
87
|
-
elif isinstance(response, str):
|
|
88
|
-
text = response
|
|
89
|
-
else:
|
|
90
|
-
raise RuntimeError("No text in LLM response")
|
|
91
|
-
|
|
92
|
-
return text.strip()
|
|
93
|
-
|
|
94
|
-
# ─────────────────────────────
|
|
95
|
-
# 공개 API
|
|
96
|
-
# ─────────────────────────────
|
|
97
|
-
async def summarize_error_to_user(exc: Exception, meta: Dict[str, Any]) -> str:
|
|
98
|
-
"""예외 정보를 바탕으로 사용자 친화적인 5줄 요약을 생성."""
|
|
99
|
-
logger.info("\n\n🔍 오류 컨텍스트 분석 시작")
|
|
100
|
-
|
|
101
|
-
err_text = f"{type(exc).__name__}: {str(exc)}"
|
|
102
|
-
|
|
103
|
-
# 가벼운 스택 문자열 (상위 3프레임)
|
|
104
|
-
try:
|
|
105
|
-
tb = "".join(traceback.TracebackException.from_exception(exc, limit=3).format())
|
|
106
|
-
except Exception:
|
|
107
|
-
tb = traceback.format_exc(limit=3)
|
|
108
|
-
|
|
109
|
-
meta_items: List[str] = []
|
|
110
|
-
for k in ("task_id", "proc_inst_id", "agent_orch", "tool"):
|
|
111
|
-
v = meta.get(k)
|
|
112
|
-
if v:
|
|
113
|
-
meta_items.append(f"{k}={v}")
|
|
114
|
-
meta_text = ", ".join(meta_items)
|
|
115
|
-
|
|
116
|
-
logger.info("📋 오류 컨텍스트 정리 완료 - %s", meta_text)
|
|
117
|
-
|
|
118
|
-
system = (
|
|
119
|
-
"당신은 엔터프라이즈 SDK의 오류 비서입니다. "
|
|
120
|
-
"사용자(비개발자도 이해 가능)를 위해, 아래 조건을 정확히 지켜 5줄로 한국어 설명을 만드세요.\n"
|
|
121
|
-
"형식: 각 줄은 1문장씩, 총 5줄.\n"
|
|
122
|
-
"포함 요소: ①무슨 문제인지(원인 추정) ②어떤 영향이 있는지 ③즉시 할 일(대처) "
|
|
123
|
-
"④재발 방지 팁 ⑤필요시 지원 요청 경로.\n"
|
|
124
|
-
"과장 금지, 간결하고 친절하게."
|
|
125
|
-
)
|
|
126
|
-
user = (
|
|
127
|
-
f"[오류요약대상]\n"
|
|
128
|
-
f"- 컨텍스트: {meta_text}\n"
|
|
129
|
-
f"- 에러: {err_text}\n"
|
|
130
|
-
f"- 스택(상위 3프레임):\n{tb}\n"
|
|
131
|
-
f"위 정보를 바탕으로 5줄 설명을 출력하세요."
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
try:
|
|
135
|
-
text = await _llm_request(system, user)
|
|
136
|
-
logger.info("✅ LLM 오류 요약 생성 완료")
|
|
137
|
-
return text
|
|
138
|
-
except Exception as e:
|
|
139
|
-
logger.warning("⚠️ LLM 오류 요약 생성 실패: %s", e, exc_info=True)
|
|
140
|
-
raise
|
|
141
|
-
|
|
142
|
-
async def summarize_feedback(feedback_data: List[dict], content_data: dict = {}) -> str:
|
|
143
|
-
"""피드백과 결과물을 바탕으로 통합된 피드백 요약을 생성."""
|
|
144
|
-
logger.info(
|
|
145
|
-
"🔍 피드백 요약 처리 시작 | 피드백: %s, 결과물: %s자",
|
|
146
|
-
feedback_data, content_data)
|
|
147
|
-
|
|
148
|
-
system_prompt = _get_feedback_system_prompt()
|
|
149
|
-
user_prompt = _create_feedback_summary_prompt(feedback_data, content_data)
|
|
150
|
-
|
|
151
|
-
try:
|
|
152
|
-
text = await _llm_request(system_prompt, user_prompt)
|
|
153
|
-
logger.info("✅ LLM 피드백 요약 생성 완료")
|
|
154
|
-
return text
|
|
155
|
-
except Exception as e:
|
|
156
|
-
logger.error("❌ LLM 피드백 요약 생성 실패: %s", e, exc_info=True)
|
|
157
|
-
raise
|
|
158
|
-
|
|
159
|
-
# ─────────────────────────────
|
|
160
|
-
# 프롬프트 유틸
|
|
161
|
-
# ─────────────────────────────
|
|
162
|
-
def _create_feedback_summary_prompt(feedback_data: List[dict], content_data: dict = {}) -> str:
|
|
163
|
-
"""피드백 정리 프롬프트 - 현재 결과물과 피드백을 함께 분석"""
|
|
164
|
-
blocks: List[str] = ["다음은 사용자의 피드백과 결과물입니다. 이를 분석하여 통합된 피드백을 작성해주세요:"]
|
|
165
|
-
if feedback_data:
|
|
166
|
-
blocks.append(f"=== 피드백 내용 ===\n{feedback_data}")
|
|
167
|
-
if content_data:
|
|
168
|
-
blocks.append(f"=== 현재 결과물/작업 내용 ===\n{content_data}")
|
|
169
|
-
|
|
170
|
-
blocks.append(
|
|
171
|
-
"""**상황 분석 및 처리 방식:**
|
|
172
|
-
- **현재 결과물을 보고 어떤 점이 문제인지, 개선이 필요한지 판단**
|
|
173
|
-
- 피드백이 있다면 그 의도와 요구사항을 정확히 파악
|
|
174
|
-
- 결과물 자체가 마음에 안들어서 다시 작업을 요청하는 경우일 수 있음
|
|
175
|
-
- 작업 방식이나 접근법이 잘못되었다고 판단하는 경우일 수 있음
|
|
176
|
-
- 부분적으로는 좋지만 특정 부분의 수정이나 보완이 필요한 경우일 수 있음
|
|
177
|
-
- 현재 결과물에 매몰되지 말고, 실제 어떤 부분이 문제인지 파악하여 개선 방안을 제시
|
|
178
|
-
|
|
179
|
-
**피드백 통합 원칙:**
|
|
180
|
-
- **가장 최신 피드백을 최우선으로 반영**
|
|
181
|
-
- 결과물과 피드백을 종합적으로 분석하여 핵심 문제점 파악
|
|
182
|
-
- **시간 흐름을 파악하여 피드백들 간의 연결고리와 문맥을 이해**
|
|
183
|
-
- 구체적이고 실행 가능한 개선사항 제시
|
|
184
|
-
- **자연스럽고 통합된 하나의 완전한 피드백으로 작성**
|
|
185
|
-
- 최대 1000자까지 허용하여 상세히 작성
|
|
186
|
-
- 만약 전달된 피드백 내용이 1000자 미만일 경우 요약하지 않고 하나의 문맥으로 그대로 반환
|
|
187
|
-
|
|
188
|
-
**중요한 상황별 처리:**
|
|
189
|
-
- 결과물 품질에 대한 불만 → **품질 개선** 요구
|
|
190
|
-
- 작업 방식에 대한 불만 → **접근법 변경** 요구
|
|
191
|
-
- 이전에 저장을 했는데 잘못 저장되었다면 → **수정**이 필요
|
|
192
|
-
- 이전에 조회만 했는데 저장이 필요하다면 → **저장**이 필요
|
|
193
|
-
- 부분적 수정이 필요하다면 → **특정 부분 개선** 요구
|
|
194
|
-
|
|
195
|
-
출력 형식: 현재 상황을 종합적으로 분석한 완전한 피드백 문장 (다음 작업자가 즉시 이해하고 실행할 수 있도록)"""
|
|
196
|
-
)
|
|
197
|
-
return "\n\n".join(blocks)
|
|
198
|
-
|
|
199
|
-
def _get_feedback_system_prompt() -> str:
|
|
200
|
-
"""피드백 요약용 시스템 프롬프트"""
|
|
201
|
-
return """당신은 피드백 정리 전문가입니다.
|
|
202
|
-
|
|
203
|
-
핵심 원칙:
|
|
204
|
-
- 최신 피드백을 최우선으로 하여 시간 흐름을 파악
|
|
205
|
-
- 피드백 간 문맥과 연결고리를 파악하여 하나의 완전한 요청으로 통합
|
|
206
|
-
- 자연스럽고 통합된 피드백으로 작성
|
|
207
|
-
- 구체적인 요구사항과 개선사항을 누락 없이 포함
|
|
208
|
-
- 다음 작업자가 즉시 이해할 수 있도록 명확하게"""
|
|
1
|
+
import os
|
|
2
|
+
import logging
|
|
3
|
+
import traceback
|
|
4
|
+
from typing import Any, Dict, Optional, List
|
|
5
|
+
from llm_factory import create_llm
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# ─────────────────────────────
|
|
12
|
+
# Lazy Singleton LLM Client
|
|
13
|
+
# ─────────────────────────────
|
|
14
|
+
_client = None
|
|
15
|
+
_global_agent_model = None
|
|
16
|
+
|
|
17
|
+
def set_agent_model(agent: Optional[Dict[str, Any]]) -> None:
|
|
18
|
+
"""첫 번째 에이전트의 모델을 글로벌 변수에 설정합니다."""
|
|
19
|
+
global _global_agent_model
|
|
20
|
+
|
|
21
|
+
if agent:
|
|
22
|
+
model = agent.get("model")
|
|
23
|
+
if model:
|
|
24
|
+
# "openai/gpt-4o" 형식을 파싱하여 provider와 model 분리
|
|
25
|
+
if "/" in model:
|
|
26
|
+
provider, model_name = model.split("/", 1)
|
|
27
|
+
_global_agent_model = {"provider": provider, "model": model_name}
|
|
28
|
+
logger.info("🤖 글로벌 에이전트 모델 설정: %s/%s", provider, model_name)
|
|
29
|
+
else:
|
|
30
|
+
# 벤더사명이 없으면 모델명만 저장
|
|
31
|
+
_global_agent_model = {"provider": None, "model": model}
|
|
32
|
+
logger.info("🤖 글로벌 에이전트 모델 설정: %s", model)
|
|
33
|
+
else:
|
|
34
|
+
_global_agent_model = None
|
|
35
|
+
logger.info("🤖 에이전트에 모델 정보가 없음")
|
|
36
|
+
else:
|
|
37
|
+
_global_agent_model = None
|
|
38
|
+
logger.info("🤖 에이전트가 없음")
|
|
39
|
+
|
|
40
|
+
def get_agent_model() -> Optional[str]:
|
|
41
|
+
"""글로벌 에이전트 모델 정보를 반환합니다."""
|
|
42
|
+
return _global_agent_model
|
|
43
|
+
|
|
44
|
+
def get_client():
|
|
45
|
+
global _client
|
|
46
|
+
if _client is not None:
|
|
47
|
+
return _client
|
|
48
|
+
|
|
49
|
+
# 글로벌 에이전트 모델로 클라이언트 생성
|
|
50
|
+
agent_model = get_agent_model()
|
|
51
|
+
if agent_model:
|
|
52
|
+
provider = agent_model["provider"]
|
|
53
|
+
model_name = agent_model["model"]
|
|
54
|
+
|
|
55
|
+
if provider:
|
|
56
|
+
# 벤더사가 있으면 provider와 model 모두 전달
|
|
57
|
+
_client = create_llm(provider=provider, model=model_name, temperature=0)
|
|
58
|
+
logger.info("🤖 글로벌 에이전트 모델로 LLM 클라이언트 초기화: %s/%s", provider, model_name)
|
|
59
|
+
else:
|
|
60
|
+
# 벤더사가 없으면 model만 전달
|
|
61
|
+
_client = create_llm(model=model_name, temperature=0)
|
|
62
|
+
logger.info("🤖 글로벌 에이전트 모델로 LLM 클라이언트 초기화: %s", model_name)
|
|
63
|
+
else:
|
|
64
|
+
_client = create_llm(model="gpt-4.1-mini", temperature=0)
|
|
65
|
+
logger.info("🔧 기본 모델로 LLM 클라이언트 초기화: gpt-4.1-mini")
|
|
66
|
+
return _client
|
|
67
|
+
|
|
68
|
+
# ─────────────────────────────
|
|
69
|
+
# 공통 LLM 호출 유틸
|
|
70
|
+
# ─────────────────────────────
|
|
71
|
+
async def _llm_request(system: str, user: str) -> str:
|
|
72
|
+
logger.info("📡 LLM 요청 전송")
|
|
73
|
+
|
|
74
|
+
model = get_client()
|
|
75
|
+
|
|
76
|
+
# llm_factory를 사용한 LLM 호출
|
|
77
|
+
messages = [
|
|
78
|
+
{"role": "system", "content": system},
|
|
79
|
+
{"role": "user", "content": user},
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
response = await model.ainvoke(messages)
|
|
83
|
+
|
|
84
|
+
# 응답에서 텍스트 추출
|
|
85
|
+
if hasattr(response, 'content'):
|
|
86
|
+
text = response.content
|
|
87
|
+
elif isinstance(response, str):
|
|
88
|
+
text = response
|
|
89
|
+
else:
|
|
90
|
+
raise RuntimeError("No text in LLM response")
|
|
91
|
+
|
|
92
|
+
return text.strip()
|
|
93
|
+
|
|
94
|
+
# ─────────────────────────────
|
|
95
|
+
# 공개 API
|
|
96
|
+
# ─────────────────────────────
|
|
97
|
+
async def summarize_error_to_user(exc: Exception, meta: Dict[str, Any]) -> str:
|
|
98
|
+
"""예외 정보를 바탕으로 사용자 친화적인 5줄 요약을 생성."""
|
|
99
|
+
logger.info("\n\n🔍 오류 컨텍스트 분석 시작")
|
|
100
|
+
|
|
101
|
+
err_text = f"{type(exc).__name__}: {str(exc)}"
|
|
102
|
+
|
|
103
|
+
# 가벼운 스택 문자열 (상위 3프레임)
|
|
104
|
+
try:
|
|
105
|
+
tb = "".join(traceback.TracebackException.from_exception(exc, limit=3).format())
|
|
106
|
+
except Exception:
|
|
107
|
+
tb = traceback.format_exc(limit=3)
|
|
108
|
+
|
|
109
|
+
meta_items: List[str] = []
|
|
110
|
+
for k in ("task_id", "proc_inst_id", "agent_orch", "tool"):
|
|
111
|
+
v = meta.get(k)
|
|
112
|
+
if v:
|
|
113
|
+
meta_items.append(f"{k}={v}")
|
|
114
|
+
meta_text = ", ".join(meta_items)
|
|
115
|
+
|
|
116
|
+
logger.info("📋 오류 컨텍스트 정리 완료 - %s", meta_text)
|
|
117
|
+
|
|
118
|
+
system = (
|
|
119
|
+
"당신은 엔터프라이즈 SDK의 오류 비서입니다. "
|
|
120
|
+
"사용자(비개발자도 이해 가능)를 위해, 아래 조건을 정확히 지켜 5줄로 한국어 설명을 만드세요.\n"
|
|
121
|
+
"형식: 각 줄은 1문장씩, 총 5줄.\n"
|
|
122
|
+
"포함 요소: ①무슨 문제인지(원인 추정) ②어떤 영향이 있는지 ③즉시 할 일(대처) "
|
|
123
|
+
"④재발 방지 팁 ⑤필요시 지원 요청 경로.\n"
|
|
124
|
+
"과장 금지, 간결하고 친절하게."
|
|
125
|
+
)
|
|
126
|
+
user = (
|
|
127
|
+
f"[오류요약대상]\n"
|
|
128
|
+
f"- 컨텍스트: {meta_text}\n"
|
|
129
|
+
f"- 에러: {err_text}\n"
|
|
130
|
+
f"- 스택(상위 3프레임):\n{tb}\n"
|
|
131
|
+
f"위 정보를 바탕으로 5줄 설명을 출력하세요."
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
text = await _llm_request(system, user)
|
|
136
|
+
logger.info("✅ LLM 오류 요약 생성 완료")
|
|
137
|
+
return text
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.warning("⚠️ LLM 오류 요약 생성 실패: %s", e, exc_info=True)
|
|
140
|
+
raise
|
|
141
|
+
|
|
142
|
+
async def summarize_feedback(feedback_data: List[dict], content_data: dict = {}) -> str:
|
|
143
|
+
"""피드백과 결과물을 바탕으로 통합된 피드백 요약을 생성."""
|
|
144
|
+
logger.info(
|
|
145
|
+
"🔍 피드백 요약 처리 시작 | 피드백: %s, 결과물: %s자",
|
|
146
|
+
feedback_data, content_data)
|
|
147
|
+
|
|
148
|
+
system_prompt = _get_feedback_system_prompt()
|
|
149
|
+
user_prompt = _create_feedback_summary_prompt(feedback_data, content_data)
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
text = await _llm_request(system_prompt, user_prompt)
|
|
153
|
+
logger.info("✅ LLM 피드백 요약 생성 완료")
|
|
154
|
+
return text
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.error("❌ LLM 피드백 요약 생성 실패: %s", e, exc_info=True)
|
|
157
|
+
raise
|
|
158
|
+
|
|
159
|
+
# ─────────────────────────────
|
|
160
|
+
# 프롬프트 유틸
|
|
161
|
+
# ─────────────────────────────
|
|
162
|
+
def _create_feedback_summary_prompt(feedback_data: List[dict], content_data: dict = {}) -> str:
|
|
163
|
+
"""피드백 정리 프롬프트 - 현재 결과물과 피드백을 함께 분석"""
|
|
164
|
+
blocks: List[str] = ["다음은 사용자의 피드백과 결과물입니다. 이를 분석하여 통합된 피드백을 작성해주세요:"]
|
|
165
|
+
if feedback_data:
|
|
166
|
+
blocks.append(f"=== 피드백 내용 ===\n{feedback_data}")
|
|
167
|
+
if content_data:
|
|
168
|
+
blocks.append(f"=== 현재 결과물/작업 내용 ===\n{content_data}")
|
|
169
|
+
|
|
170
|
+
blocks.append(
|
|
171
|
+
"""**상황 분석 및 처리 방식:**
|
|
172
|
+
- **현재 결과물을 보고 어떤 점이 문제인지, 개선이 필요한지 판단**
|
|
173
|
+
- 피드백이 있다면 그 의도와 요구사항을 정확히 파악
|
|
174
|
+
- 결과물 자체가 마음에 안들어서 다시 작업을 요청하는 경우일 수 있음
|
|
175
|
+
- 작업 방식이나 접근법이 잘못되었다고 판단하는 경우일 수 있음
|
|
176
|
+
- 부분적으로는 좋지만 특정 부분의 수정이나 보완이 필요한 경우일 수 있음
|
|
177
|
+
- 현재 결과물에 매몰되지 말고, 실제 어떤 부분이 문제인지 파악하여 개선 방안을 제시
|
|
178
|
+
|
|
179
|
+
**피드백 통합 원칙:**
|
|
180
|
+
- **가장 최신 피드백을 최우선으로 반영**
|
|
181
|
+
- 결과물과 피드백을 종합적으로 분석하여 핵심 문제점 파악
|
|
182
|
+
- **시간 흐름을 파악하여 피드백들 간의 연결고리와 문맥을 이해**
|
|
183
|
+
- 구체적이고 실행 가능한 개선사항 제시
|
|
184
|
+
- **자연스럽고 통합된 하나의 완전한 피드백으로 작성**
|
|
185
|
+
- 최대 1000자까지 허용하여 상세히 작성
|
|
186
|
+
- 만약 전달된 피드백 내용이 1000자 미만일 경우 요약하지 않고 하나의 문맥으로 그대로 반환
|
|
187
|
+
|
|
188
|
+
**중요한 상황별 처리:**
|
|
189
|
+
- 결과물 품질에 대한 불만 → **품질 개선** 요구
|
|
190
|
+
- 작업 방식에 대한 불만 → **접근법 변경** 요구
|
|
191
|
+
- 이전에 저장을 했는데 잘못 저장되었다면 → **수정**이 필요
|
|
192
|
+
- 이전에 조회만 했는데 저장이 필요하다면 → **저장**이 필요
|
|
193
|
+
- 부분적 수정이 필요하다면 → **특정 부분 개선** 요구
|
|
194
|
+
|
|
195
|
+
출력 형식: 현재 상황을 종합적으로 분석한 완전한 피드백 문장 (다음 작업자가 즉시 이해하고 실행할 수 있도록)"""
|
|
196
|
+
)
|
|
197
|
+
return "\n\n".join(blocks)
|
|
198
|
+
|
|
199
|
+
def _get_feedback_system_prompt() -> str:
|
|
200
|
+
"""피드백 요약용 시스템 프롬프트"""
|
|
201
|
+
return """당신은 피드백 정리 전문가입니다.
|
|
202
|
+
|
|
203
|
+
핵심 원칙:
|
|
204
|
+
- 최신 피드백을 최우선으로 하여 시간 흐름을 파악
|
|
205
|
+
- 피드백 간 문맥과 연결고리를 파악하여 하나의 완전한 요청으로 통합
|
|
206
|
+
- 자연스럽고 통합된 피드백으로 작성
|
|
207
|
+
- 구체적인 요구사항과 개선사항을 누락 없이 포함
|
|
208
|
+
- 다음 작업자가 즉시 이해할 수 있도록 명확하게"""
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
processgpt_agent_sdk/__init__.py,sha256=9Zy0LAGIHoQBvoyW1pSO8RMB0FmsxGdyrT8TV16Z-q8,1072
|
|
2
|
-
processgpt_agent_sdk/database.py,sha256=VzDwDQNUgt_IdmkRrnxYe6rSI6zuLo5Zbe3RiFFn9vg,14215
|
|
3
|
-
processgpt_agent_sdk/processgpt_agent_framework.py,sha256=2OcaP6NvsORw1JJh71d7s0D_vmlB0fgiEimnOknnL9M,21983
|
|
4
|
-
processgpt_agent_sdk/single_run.py,sha256=xI5s4neWQ4WE1Fx5_TiBwEypHRTgBFX1WODj-lZqGaY,1050
|
|
5
|
-
processgpt_agent_sdk/utils.py,sha256=pK7plUKGMIHo5lA0e4442qMAmAtCwKrbewjrXdVbFdE,9228
|
|
6
|
-
process_gpt_agent_sdk-0.4.4.dist-info/METADATA,sha256=GPcQxTkd23k-out2GA6-o3mFte0lJDyL8blI7u1h8ug,6840
|
|
7
|
-
process_gpt_agent_sdk-0.4.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
8
|
-
process_gpt_agent_sdk-0.4.4.dist-info/top_level.txt,sha256=Xe6zrj3_3Vv7d0pl5RRtenVUckwOVBVLQn2P03j5REo,21
|
|
9
|
-
process_gpt_agent_sdk-0.4.4.dist-info/RECORD,,
|
|
File without changes
|
{process_gpt_agent_sdk-0.4.4.dist-info → process_gpt_agent_sdk-0.4.5.dist-info}/top_level.txt
RENAMED
|
File without changes
|