process-gpt-agent-sdk 0.2.4__py3-none-any.whl → 0.2.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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: process-gpt-agent-sdk
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: Supabase 기반 이벤트/작업 폴링으로 A2A AgentExecutor를 실행하는 SDK
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/your-org/process-gpt-agent-sdk
@@ -1,7 +1,7 @@
1
1
  processgpt_agent_sdk/__init__.py,sha256=IvAL5WBZhI83LYQogRP6-i04bxZkhmkgmES4FRQY888,185
2
- processgpt_agent_sdk/server.py,sha256=mwTFJMGG-VpRw6Gox1R-V7DiflOLyYnd2QnzZmVXIjc,10920
2
+ processgpt_agent_sdk/server.py,sha256=c2H90-smVllRf0IbQtAdU_iRpZT_eTUuJNhRk_QMFyU,11324
3
3
  processgpt_agent_sdk/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- processgpt_agent_sdk/core/database.py,sha256=VGdRRSU9S0UTYrUvD2NZLn27Sv2spKwVQTAZxUMACVg,16295
4
+ processgpt_agent_sdk/core/database.py,sha256=uiq36jjvZevJCCK394PsG6MYeu94fm01cKTzkmZQcl0,15870
5
5
  processgpt_agent_sdk/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  processgpt_agent_sdk/tools/human_query_tool.py,sha256=I4Q5AS5YRem0pkIz5_bhMnS5NGlGhKky4_HE22UOdmE,10871
7
7
  processgpt_agent_sdk/tools/knowledge_tools.py,sha256=AOtxvLypu343877ZzzELGq3At-E_2NiAqEw0Njlephg,8937
@@ -9,10 +9,10 @@ processgpt_agent_sdk/tools/safe_tool_loader.py,sha256=18aT1M9FqCecu-JJvKxikYpl7n
9
9
  processgpt_agent_sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  processgpt_agent_sdk/utils/context_manager.py,sha256=efNUGxMMJi8Nxy5bOpfYAk2AIjgWoXS0tz6zkROZKrs,1804
11
11
  processgpt_agent_sdk/utils/crewai_event_listener.py,sha256=MwIMtRjw7L1uV8QRvlNV1agxRzjL3hC5EYBQIsMX2XA,9155
12
- processgpt_agent_sdk/utils/event_handler.py,sha256=8N7cQNVwhqAieLJv94VdWBt9dvwcrNpzopEJyneuJd4,2654
12
+ processgpt_agent_sdk/utils/event_handler.py,sha256=Y-m-6e4ImUivXVjQ8nV6GFSuPKTix9aElJBLA4vnErk,2856
13
13
  processgpt_agent_sdk/utils/logger.py,sha256=d6Chvwx6qLAyirXRFg4bARzEovo1UYaRgLTaknHad9E,1271
14
14
  processgpt_agent_sdk/utils/summarizer.py,sha256=0XMRZZGCM8XgmvjXMMNhbDKqFEJd5ykqqovQlbCjYZQ,5677
15
- process_gpt_agent_sdk-0.2.4.dist-info/METADATA,sha256=Fanryl1OcjeTwep1ReUQlBhqBBdlIjQO2Nes-zrtNMk,12898
16
- process_gpt_agent_sdk-0.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
- process_gpt_agent_sdk-0.2.4.dist-info/top_level.txt,sha256=Xe6zrj3_3Vv7d0pl5RRtenVUckwOVBVLQn2P03j5REo,21
18
- process_gpt_agent_sdk-0.2.4.dist-info/RECORD,,
15
+ process_gpt_agent_sdk-0.2.5.dist-info/METADATA,sha256=TqY9sHrXVz1Z_g226biFPdgmbhQeCr15e6RzDAN22Og,12898
16
+ process_gpt_agent_sdk-0.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ process_gpt_agent_sdk-0.2.5.dist-info/top_level.txt,sha256=Xe6zrj3_3Vv7d0pl5RRtenVUckwOVBVLQn2P03j5REo,21
18
+ process_gpt_agent_sdk-0.2.5.dist-info/RECORD,,
@@ -359,20 +359,10 @@ async def fetch_human_users_by_proc_inst_id(proc_inst_id: str) -> str:
359
359
  # 데이터 저장
360
360
  # 설명: 이벤트/알림/작업 결과 저장
361
361
  # ============================================================================
362
- async def record_event(todo: Dict[str, Any], data: Dict[str, Any], event_type: Optional[str] = None) -> None:
363
- """UI용 events 테이블에 이벤트 기록"""
362
+ async def record_event(payload: Dict[str, Any]) -> None:
363
+ """UI용 events 테이블에 이벤트 기록 (전달된 payload 그대로 저장)"""
364
364
  def _call():
365
365
  client = get_db_client()
366
- payload: Dict[str, Any] = {
367
- "id": str(uuid.uuid4()),
368
- "job_id": todo.get("proc_inst_id") or str(todo.get("id")),
369
- "todo_id": str(todo.get("id")),
370
- "proc_inst_id": todo.get("proc_inst_id"),
371
- "crew_type": todo.get("agent_orch"),
372
- "data": data,
373
- }
374
- if event_type is not None:
375
- payload["event_type"] = event_type
376
366
  return client.table("events").insert(payload).execute()
377
367
 
378
368
  resp = await _async_retry(_call, name="record_event", fallback=lambda: None)
@@ -132,7 +132,8 @@ class ProcessGPTAgentServer:
132
132
  executor = self._executor
133
133
 
134
134
  context = ProcessGPTRequestContext(prepared_data)
135
- event_queue = ProcessGPTEventQueue(task_record)
135
+ loop = asyncio.get_running_loop()
136
+ event_queue = ProcessGPTEventQueue(task_record, loop=loop)
136
137
 
137
138
  try:
138
139
  set_context(
@@ -234,9 +235,10 @@ class ProcessGPTRequestContext(RequestContext):
234
235
  # 설명: 실행기 이벤트를 내부 큐에 넣고, 비동기 처리 태스크를 생성해 저장 로직 호출
235
236
  # =============================================================================
236
237
  class ProcessGPTEventQueue(EventQueue):
237
- def __init__(self, task_record: Dict[str, Any]):
238
+ def __init__(self, task_record: Dict[str, Any], loop: asyncio.AbstractEventLoop | None = None):
238
239
  """현재 처리 중인 작업 레코드를 보관한다."""
239
240
  self.todo = task_record
241
+ self._loop = loop
240
242
  super().__init__()
241
243
 
242
244
  def enqueue_event(self, event: Event):
@@ -263,13 +265,27 @@ class ProcessGPTEventQueue(EventQueue):
263
265
  pass
264
266
 
265
267
  def _create_bg_task(self, coro: Any, label: str) -> None:
266
- """백그라운드 태스크 생성 및 완료 콜백으로 예외 로깅."""
268
+ """백그라운드 태스크 생성 및 완료 콜백으로 예외 로깅.
269
+
270
+ - 실행 중인 이벤트 루프가 없을 때도 전달된 루프에 안전하게 예약한다.
271
+ """
267
272
  try:
268
- task = asyncio.create_task(coro)
273
+ loop = self._loop
274
+ if loop is None:
275
+ try:
276
+ loop = asyncio.get_running_loop()
277
+ except RuntimeError:
278
+ raise
279
+
269
280
  def _cb(t: asyncio.Task):
270
281
  exc = t.exception()
271
282
  if exc:
272
283
  handle_application_error(f"백그라운드 태스크 오류({label})", exc, raise_error=False)
273
- task.add_done_callback(_cb)
284
+
285
+ def _schedule():
286
+ task = loop.create_task(coro)
287
+ task.add_done_callback(_cb)
288
+
289
+ loop.call_soon_threadsafe(_schedule)
274
290
  except Exception as e:
275
291
  handle_application_error(f"백그라운드 태스크 생성 실패({label})", e, raise_error=False)
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from typing import Any, Dict
4
+ import uuid
4
5
 
5
6
  from a2a.server.events import Event
6
7
  from .logger import handle_application_error, write_log_message
@@ -40,8 +41,10 @@ async def process_event_message(todo: Dict[str, Any], event: Event) -> None:
40
41
 
41
42
  # done: 종료 이벤트 → 기록 후 MCP 정리
42
43
  if evt_type == "done":
43
- # 워커에서 전달한 데이터를 그대로 보존해 기록
44
- await record_event(todo, data, event_type="done")
44
+ payload = data.get("data") or {}
45
+ if isinstance(payload, dict) and "id" not in payload:
46
+ payload["id"] = str(uuid.uuid4())
47
+ await record_event(payload)
45
48
  try:
46
49
  SafeToolLoader.shutdown_all_adapters()
47
50
  write_log_message("MCP 리소스 정리 완료")
@@ -56,8 +59,14 @@ async def process_event_message(todo: Dict[str, Any], event: Event) -> None:
56
59
  content = payload.get("content") if isinstance(payload, dict) else payload
57
60
  await save_task_result(str(todo.get("id")), content, final=is_final)
58
61
  return
62
+
63
+ # event : 일반 이벤트 저장 (워커 데이터 그대로 보존)
64
+ if evt_type == "event":
65
+ payload = data.get("data") or {}
66
+ if isinstance(payload, dict) and "id" not in payload:
67
+ payload["id"] = str(uuid.uuid4())
68
+ await record_event(payload)
69
+ return
59
70
 
60
- # event: 일반 이벤트 저장 (워커 데이터 그대로 보존)
61
- await record_event(todo, data, event_type="event")
62
71
  except Exception as e:
63
72
  handle_application_error("process_event_message 처리 실패", e, raise_error=False)