process-gpt-agent-sdk


Nameprocess-gpt-agent-sdk JSON
Version 0.2.7 PyPI version JSON
download
home_pageNone
SummarySupabase 기반 이벤트/작업 폴링으로 A2A AgentExecutor를 실행하는 SDK
upload_time2025-08-28 03:27:59
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT
keywords agent a2a supabase workflow sdk processgpt
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ProcessGPT Agent Framework

Google A2A SDK의 인터페이스를 활용하면서 웹소켓 대신 Supabase 실시간 DB를 사용하는 에이전트 실행 프레임워크입니다.

## 🏗️ 아키텍처 개요

이 프레임워크는 기존의 Google A2A SDK의 `AgentExecutor`와 `RequestContext` 인터페이스를 그대로 활용하되, 웹소켓 기반 통신 대신 Supabase 데이터베이스를 중간 매개체로 사용합니다.

### 핵심 구성 요소

1. **Supabase Database Tables**
   - `todolist`: 에이전트가 처리해야 할 작업들을 저장
   - `events`: 각 태스크의 실행 상태와 진행 과정을 추적

2. **ProcessGPT Server**
   - Supabase `todolist` 테이블을 폴링하여 대기 중인 작업을 감지
   - Google A2A SDK의 `AgentExecutor.execute()` 메서드를 호출
   - 커스터마이즈된 `EventQueue`를 통해 이벤트를 Supabase에 저장

3. **Custom Classes**
   - `ProcessGPTRequestContext`: todolist 데이터를 기반으로 한 RequestContext 구현
   - `ProcessGPTEventQueue`: Supabase events 테이블에 이벤트를 저장하는 EventQueue 구현

## 📊 데이터베이스 스키마

### TodoList Table
```sql
CREATE TABLE todolist (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    agent_type VARCHAR(100) NOT NULL,           -- 에이전트 타입 식별자
    prompt TEXT NOT NULL,                       -- 에이전트가 실행할 프롬프트
    input_data JSONB,                          -- 추가 입력 데이터
    agent_status VARCHAR(50) DEFAULT 'pending', -- 실행 상태
    agent_output JSONB,                        -- 실행 결과
    priority INTEGER DEFAULT 0,               -- 우선순위
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW(),
    started_at TIMESTAMPTZ,
    completed_at TIMESTAMPTZ
);
```

### Events Table
```sql
CREATE TABLE events (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    todolist_id UUID NOT NULL REFERENCES todolist(id),
    event_type VARCHAR(50) NOT NULL,           -- 이벤트 타입
    event_data JSONB NOT NULL,                -- 이벤트 상세 데이터
    context_id VARCHAR(255),                  -- A2A 컨텍스트 ID
    task_id VARCHAR(255),                     -- A2A 태스크 ID
    message TEXT,                             -- 이벤트 메시지
    created_at TIMESTAMPTZ DEFAULT NOW()
);
```

## 🚀 사용법

### 1. 환경 설정

```bash
# 의존성 설치
pip install -r requirements.txt

# 환경변수 설정 (.env 파일 생성)
cp env.example .env
# .env 파일에서 Supabase 설정을 입력하세요
```

### 2. 데이터베이스 설정

```sql
-- database_schema.sql의 내용을 Supabase에서 실행
```

### 3. 서버 실행

```bash
# CrewAI Deep Research Agent 서버 실행
cd sample_server
python crew_ai_dr_agent_server.py --agent-type crew-ai-dr --polling-interval 5
```

### 4. 태스크 제출

```python
from supabase import create_client
from processgpt_utils import ProcessGPTClient
import asyncio

# Supabase 클라이언트 초기화
supabase = create_client(
    "https://your-project.supabase.co",
    "your-anon-key"
)

# ProcessGPT 클라이언트 생성
client = ProcessGPTClient(supabase)

async def submit_task_example():
    # 태스크 제출
    todolist_id = await client.submit_task(
        agent_type="crew-ai-dr",
        prompt="Deep research on renewable energy trends",
        input_data={"domain": "energy", "depth": "comprehensive"}
    )
    
    print(f"Task submitted: {todolist_id}")
    
    # 완료까지 대기
    result = await client.wait_for_completion(todolist_id)
    print(f"Task completed: {result}")

# 실행
asyncio.run(submit_task_example())
```

## 🔄 워크플로우

### 시퀀스 다이어그램

```mermaid
sequenceDiagram
    participant Client as Client Application
    participant DB as Supabase Database
    participant TodoTable as TodoList Table
    participant EventTable as Events Table
    participant Server as ProcessGPT Agent Server
    participant Executor as Agent Executor
    participant AI as CrewAI/Langgraph/OpenAI

    Note over Client, AI: ProcessGPT Agent Framework Workflow

    %% Task Submission
    Client->>DB: Submit new task
    Client->>TodoTable: INSERT INTO todolist<br/>(agent_type, prompt, input_data, status='pending')
    TodoTable-->>Client: Return todolist_id

    %% Server Polling Loop
    loop Every 5 seconds (configurable)
        Server->>TodoTable: SELECT * FROM todolist<br/>WHERE agent_status='pending'<br/>AND agent_type='{configured_type}'
        TodoTable-->>Server: Return pending tasks
        
        alt Tasks found
            Server->>TodoTable: UPDATE todolist<br/>SET agent_status='in_progress',<br/>started_at=NOW()<br/>WHERE id='{todolist_id}'
            
            %% Event Logging - Task Started
            Server->>EventTable: INSERT INTO events<br/>(todolist_id, event_type='task_started',<br/>event_data, message)
            
            %% Create Request Context
            Server->>Server: Create ProcessGPTRequestContext<br/>from todolist data
            
            %% Create Event Queue
            Server->>Server: Create ProcessGPTEventQueue<br/>with Supabase connection
            
            %% Execute Agent
            Server->>Executor: execute(context, event_queue)
            
            %% Agent Processing with AI Frameworks
            Executor->>AI: Use AI frameworks<br/>(CrewAI, Langgraph, OpenAI)<br/>with A2A interfaces
            
            loop During Agent Execution
                AI->>Executor: Progress events/status updates
                Executor->>Server: Forward events to ProcessGPTEventQueue
                Server->>EventTable: INSERT INTO events<br/>(todolist_id, event_type, event_data)
            end
            
            alt Agent Success
                AI-->>Executor: Task completed successfully
                Executor-->>Server: Task completion
                Server->>EventTable: INSERT INTO events<br/>(event_type='task_completed')
                Server->>TodoTable: UPDATE todolist<br/>SET agent_status='completed',<br/>agent_output='{result}',<br/>completed_at=NOW()
            else Agent Failure
                AI-->>Executor: Task failed with error
                Executor-->>Server: Task failure
                Server->>EventTable: INSERT INTO events<br/>(event_type='task_failed', error)
                Server->>TodoTable: UPDATE todolist<br/>SET agent_status='failed',<br/>agent_output='{error}',<br/>completed_at=NOW()
            end
        else No tasks
            Note over Server: Wait for next polling cycle
        end
    end

    %% Client Status Monitoring
    loop Client Monitoring
        Client->>TodoTable: SELECT * FROM todolist<br/>WHERE id='{todolist_id}'
        TodoTable-->>Client: Return task status
        
        Client->>EventTable: SELECT * FROM events<br/>WHERE todolist_id='{todolist_id}'<br/>ORDER BY created_at
        EventTable-->>Client: Return event history
        
        alt Task Completed
            Note over Client: Process final result
        else Task Still Running
            Note over Client: Continue monitoring
        end
    end
```

### 워크플로우 단계

1. **태스크 제출**: 클라이언트가 `todolist` 테이블에 새로운 작업을 INSERT
2. **폴링**: ProcessGPT Agent Server가 주기적으로 `pending` 상태의 작업들을 조회
3. **상태 업데이트**: 발견된 작업의 상태를 `in_progress`로 변경
4. **컨텍스트 생성**: todolist 데이터를 기반으로 `ProcessGPTRequestContext` 생성
5. **이벤트 큐 생성**: Supabase 연동 `ProcessGPTEventQueue` 생성
6. **에이전트 실행**: Google A2A SDK 인터페이스를 통해 AI 프레임워크(CrewAI, Langgraph, OpenAI) 호출
7. **이벤트 로깅**: 실행 과정의 모든 이벤트가 `events` 테이블에 저장
8. **완료 처리**: 최종 결과가 `todolist`의 `agent_output`에 저장

## 🛠️ 커스터마이제이션

### 새로운 에이전트 타입 추가

1. `AgentExecutor`를 상속받는 새로운 클래스 생성:

```python
from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.events import EventQueue

class MyCustomAgentExecutor(AgentExecutor):
    async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
        # 에이전트 로직 구현
        pass
    
    async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
        # 취소 로직 구현
        pass
```

2. 새로운 서버 스크립트 생성:

```python
from processgpt_agent_framework import ProcessGPTAgentServer
from my_custom_agent_executor import MyCustomAgentExecutor

agent_executor = MyCustomAgentExecutor()
server = ProcessGPTAgentServer(
    agent_executor=agent_executor,
    agent_type="my-custom-agent"
)

asyncio.run(server.run())
```

### RequestContext 확장

기본 `ProcessGPTRequestContext`를 상속받아 추가 기능을 구현할 수 있습니다:

```python
class ExtendedRequestContext(ProcessGPTRequestContext):
    def __init__(self, todolist_item: TodoListItem):
        super().__init__(todolist_item)
        # 추가 초기화 로직
    
    def get_custom_data(self):
        # 커스텀 데이터 반환 로직
        return self.todolist_item.input_data.get('custom_field')
```

## 📊 모니터링

시스템 상태를 모니터링하기 위한 유틸리티:

```python
from processgpt_utils import ProcessGPTMonitor

monitor = ProcessGPTMonitor(supabase)

# 시스템 통계 조회
stats = await monitor.get_system_stats()
print(f"Total tasks: {stats['total_tasks']}")
print(f"Pending: {stats['pending_tasks']}")
print(f"Completed: {stats['completed_tasks']}")

# 최근 이벤트 조회
recent_events = await monitor.get_recent_events(limit=10)
```

## 🔧 설정 옵션

### 환경변수

```bash
# Supabase 설정
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-key-here

# 에이전트 설정
DEFAULT_AGENT_TYPE=crew-ai-dr
DEFAULT_POLLING_INTERVAL=5

# 로깅
LOG_LEVEL=INFO
```

### 서버 옵션

```bash
# 폴링 간격 설정 (초)
python server.py --polling-interval 10

# 특정 에이전트 타입만 처리
python server.py --agent-type my-custom-agent
```

## 🐛 트러블슈팅

### 일반적인 문제들

1. **Supabase 연결 실패**
   - 환경변수 `SUPABASE_URL`과 `SUPABASE_ANON_KEY` 확인
   - 네트워크 연결 상태 확인

2. **폴링이 작동하지 않음**
   - 데이터베이스 테이블이 올바르게 생성되었는지 확인
   - `agent_type`이 정확히 매칭되는지 확인

3. **이벤트가 저장되지 않음**
   - Supabase RLS (Row Level Security) 정책 확인
   - 테이블 권한 설정 확인

### 로그 확인

```bash
# 디버그 모드로 실행
LOG_LEVEL=DEBUG python server.py
```

## 🤝 기여

1. Fork the repository
2. Create a feature branch
3. Commit your changes
4. Push to the branch
5. Create a Pull Request

## 📄 라이선스

MIT License - 자세한 내용은 LICENSE 파일을 참조하세요.

## 🔗 관련 링크

- [Google A2A SDK Documentation](https://developers.google.com/a2a)
- [Supabase Documentation](https://supabase.com/docs)
- [ProcessGPT Framework Issues](https://github.com/your-repo/issues) 

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "process-gpt-agent-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "agent, a2a, supabase, workflow, sdk, processgpt",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/f1/b6/c5df0d6513b619422a06b7d4004b4ac2647dc65fc76690401a9cb06209b8/process_gpt_agent_sdk-0.2.7.tar.gz",
    "platform": null,
    "description": "# ProcessGPT Agent Framework\r\n\r\nGoogle A2A SDK\uc758 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud65c\uc6a9\ud558\uba74\uc11c \uc6f9\uc18c\ucf13 \ub300\uc2e0 Supabase \uc2e4\uc2dc\uac04 DB\ub97c \uc0ac\uc6a9\ud558\ub294 \uc5d0\uc774\uc804\ud2b8 \uc2e4\ud589 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4.\r\n\r\n## \ud83c\udfd7\ufe0f \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694\r\n\r\n\uc774 \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uae30\uc874\uc758 Google A2A SDK\uc758 `AgentExecutor`\uc640 `RequestContext` \uc778\ud130\ud398\uc774\uc2a4\ub97c \uadf8\ub300\ub85c \ud65c\uc6a9\ud558\ub418, \uc6f9\uc18c\ucf13 \uae30\ubc18 \ud1b5\uc2e0 \ub300\uc2e0 Supabase \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc911\uac04 \ub9e4\uac1c\uccb4\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\r\n\r\n### \ud575\uc2ec \uad6c\uc131 \uc694\uc18c\r\n\r\n1. **Supabase Database Tables**\r\n   - `todolist`: \uc5d0\uc774\uc804\ud2b8\uac00 \ucc98\ub9ac\ud574\uc57c \ud560 \uc791\uc5c5\ub4e4\uc744 \uc800\uc7a5\r\n   - `events`: \uac01 \ud0dc\uc2a4\ud06c\uc758 \uc2e4\ud589 \uc0c1\ud0dc\uc640 \uc9c4\ud589 \uacfc\uc815\uc744 \ucd94\uc801\r\n\r\n2. **ProcessGPT Server**\r\n   - Supabase `todolist` \ud14c\uc774\ube14\uc744 \ud3f4\ub9c1\ud558\uc5ec \ub300\uae30 \uc911\uc778 \uc791\uc5c5\uc744 \uac10\uc9c0\r\n   - Google A2A SDK\uc758 `AgentExecutor.execute()` \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\r\n   - \ucee4\uc2a4\ud130\ub9c8\uc774\uc988\ub41c `EventQueue`\ub97c \ud1b5\ud574 \uc774\ubca4\ud2b8\ub97c Supabase\uc5d0 \uc800\uc7a5\r\n\r\n3. **Custom Classes**\r\n   - `ProcessGPTRequestContext`: todolist \ub370\uc774\ud130\ub97c \uae30\ubc18\uc73c\ub85c \ud55c RequestContext \uad6c\ud604\r\n   - `ProcessGPTEventQueue`: Supabase events \ud14c\uc774\ube14\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc800\uc7a5\ud558\ub294 EventQueue \uad6c\ud604\r\n\r\n## \ud83d\udcca \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc2a4\ud0a4\ub9c8\r\n\r\n### TodoList Table\r\n```sql\r\nCREATE TABLE todolist (\r\n    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\r\n    agent_type VARCHAR(100) NOT NULL,           -- \uc5d0\uc774\uc804\ud2b8 \ud0c0\uc785 \uc2dd\ubcc4\uc790\r\n    prompt TEXT NOT NULL,                       -- \uc5d0\uc774\uc804\ud2b8\uac00 \uc2e4\ud589\ud560 \ud504\ub86c\ud504\ud2b8\r\n    input_data JSONB,                          -- \ucd94\uac00 \uc785\ub825 \ub370\uc774\ud130\r\n    agent_status VARCHAR(50) DEFAULT 'pending', -- \uc2e4\ud589 \uc0c1\ud0dc\r\n    agent_output JSONB,                        -- \uc2e4\ud589 \uacb0\uacfc\r\n    priority INTEGER DEFAULT 0,               -- \uc6b0\uc120\uc21c\uc704\r\n    created_at TIMESTAMPTZ DEFAULT NOW(),\r\n    updated_at TIMESTAMPTZ DEFAULT NOW(),\r\n    started_at TIMESTAMPTZ,\r\n    completed_at TIMESTAMPTZ\r\n);\r\n```\r\n\r\n### Events Table\r\n```sql\r\nCREATE TABLE events (\r\n    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\r\n    todolist_id UUID NOT NULL REFERENCES todolist(id),\r\n    event_type VARCHAR(50) NOT NULL,           -- \uc774\ubca4\ud2b8 \ud0c0\uc785\r\n    event_data JSONB NOT NULL,                -- \uc774\ubca4\ud2b8 \uc0c1\uc138 \ub370\uc774\ud130\r\n    context_id VARCHAR(255),                  -- A2A \ucee8\ud14d\uc2a4\ud2b8 ID\r\n    task_id VARCHAR(255),                     -- A2A \ud0dc\uc2a4\ud06c ID\r\n    message TEXT,                             -- \uc774\ubca4\ud2b8 \uba54\uc2dc\uc9c0\r\n    created_at TIMESTAMPTZ DEFAULT NOW()\r\n);\r\n```\r\n\r\n## \ud83d\ude80 \uc0ac\uc6a9\ubc95\r\n\r\n### 1. \ud658\uacbd \uc124\uc815\r\n\r\n```bash\r\n# \uc758\uc874\uc131 \uc124\uce58\r\npip install -r requirements.txt\r\n\r\n# \ud658\uacbd\ubcc0\uc218 \uc124\uc815 (.env \ud30c\uc77c \uc0dd\uc131)\r\ncp env.example .env\r\n# .env \ud30c\uc77c\uc5d0\uc11c Supabase \uc124\uc815\uc744 \uc785\ub825\ud558\uc138\uc694\r\n```\r\n\r\n### 2. \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc124\uc815\r\n\r\n```sql\r\n-- database_schema.sql\uc758 \ub0b4\uc6a9\uc744 Supabase\uc5d0\uc11c \uc2e4\ud589\r\n```\r\n\r\n### 3. \uc11c\ubc84 \uc2e4\ud589\r\n\r\n```bash\r\n# CrewAI Deep Research Agent \uc11c\ubc84 \uc2e4\ud589\r\ncd sample_server\r\npython crew_ai_dr_agent_server.py --agent-type crew-ai-dr --polling-interval 5\r\n```\r\n\r\n### 4. \ud0dc\uc2a4\ud06c \uc81c\ucd9c\r\n\r\n```python\r\nfrom supabase import create_client\r\nfrom processgpt_utils import ProcessGPTClient\r\nimport asyncio\r\n\r\n# Supabase \ud074\ub77c\uc774\uc5b8\ud2b8 \ucd08\uae30\ud654\r\nsupabase = create_client(\r\n    \"https://your-project.supabase.co\",\r\n    \"your-anon-key\"\r\n)\r\n\r\n# ProcessGPT \ud074\ub77c\uc774\uc5b8\ud2b8 \uc0dd\uc131\r\nclient = ProcessGPTClient(supabase)\r\n\r\nasync def submit_task_example():\r\n    # \ud0dc\uc2a4\ud06c \uc81c\ucd9c\r\n    todolist_id = await client.submit_task(\r\n        agent_type=\"crew-ai-dr\",\r\n        prompt=\"Deep research on renewable energy trends\",\r\n        input_data={\"domain\": \"energy\", \"depth\": \"comprehensive\"}\r\n    )\r\n    \r\n    print(f\"Task submitted: {todolist_id}\")\r\n    \r\n    # \uc644\ub8cc\uae4c\uc9c0 \ub300\uae30\r\n    result = await client.wait_for_completion(todolist_id)\r\n    print(f\"Task completed: {result}\")\r\n\r\n# \uc2e4\ud589\r\nasyncio.run(submit_task_example())\r\n```\r\n\r\n## \ud83d\udd04 \uc6cc\ud06c\ud50c\ub85c\uc6b0\r\n\r\n### \uc2dc\ud000\uc2a4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\r\n\r\n```mermaid\r\nsequenceDiagram\r\n    participant Client as Client Application\r\n    participant DB as Supabase Database\r\n    participant TodoTable as TodoList Table\r\n    participant EventTable as Events Table\r\n    participant Server as ProcessGPT Agent Server\r\n    participant Executor as Agent Executor\r\n    participant AI as CrewAI/Langgraph/OpenAI\r\n\r\n    Note over Client, AI: ProcessGPT Agent Framework Workflow\r\n\r\n    %% Task Submission\r\n    Client->>DB: Submit new task\r\n    Client->>TodoTable: INSERT INTO todolist<br/>(agent_type, prompt, input_data, status='pending')\r\n    TodoTable-->>Client: Return todolist_id\r\n\r\n    %% Server Polling Loop\r\n    loop Every 5 seconds (configurable)\r\n        Server->>TodoTable: SELECT * FROM todolist<br/>WHERE agent_status='pending'<br/>AND agent_type='{configured_type}'\r\n        TodoTable-->>Server: Return pending tasks\r\n        \r\n        alt Tasks found\r\n            Server->>TodoTable: UPDATE todolist<br/>SET agent_status='in_progress',<br/>started_at=NOW()<br/>WHERE id='{todolist_id}'\r\n            \r\n            %% Event Logging - Task Started\r\n            Server->>EventTable: INSERT INTO events<br/>(todolist_id, event_type='task_started',<br/>event_data, message)\r\n            \r\n            %% Create Request Context\r\n            Server->>Server: Create ProcessGPTRequestContext<br/>from todolist data\r\n            \r\n            %% Create Event Queue\r\n            Server->>Server: Create ProcessGPTEventQueue<br/>with Supabase connection\r\n            \r\n            %% Execute Agent\r\n            Server->>Executor: execute(context, event_queue)\r\n            \r\n            %% Agent Processing with AI Frameworks\r\n            Executor->>AI: Use AI frameworks<br/>(CrewAI, Langgraph, OpenAI)<br/>with A2A interfaces\r\n            \r\n            loop During Agent Execution\r\n                AI->>Executor: Progress events/status updates\r\n                Executor->>Server: Forward events to ProcessGPTEventQueue\r\n                Server->>EventTable: INSERT INTO events<br/>(todolist_id, event_type, event_data)\r\n            end\r\n            \r\n            alt Agent Success\r\n                AI-->>Executor: Task completed successfully\r\n                Executor-->>Server: Task completion\r\n                Server->>EventTable: INSERT INTO events<br/>(event_type='task_completed')\r\n                Server->>TodoTable: UPDATE todolist<br/>SET agent_status='completed',<br/>agent_output='{result}',<br/>completed_at=NOW()\r\n            else Agent Failure\r\n                AI-->>Executor: Task failed with error\r\n                Executor-->>Server: Task failure\r\n                Server->>EventTable: INSERT INTO events<br/>(event_type='task_failed', error)\r\n                Server->>TodoTable: UPDATE todolist<br/>SET agent_status='failed',<br/>agent_output='{error}',<br/>completed_at=NOW()\r\n            end\r\n        else No tasks\r\n            Note over Server: Wait for next polling cycle\r\n        end\r\n    end\r\n\r\n    %% Client Status Monitoring\r\n    loop Client Monitoring\r\n        Client->>TodoTable: SELECT * FROM todolist<br/>WHERE id='{todolist_id}'\r\n        TodoTable-->>Client: Return task status\r\n        \r\n        Client->>EventTable: SELECT * FROM events<br/>WHERE todolist_id='{todolist_id}'<br/>ORDER BY created_at\r\n        EventTable-->>Client: Return event history\r\n        \r\n        alt Task Completed\r\n            Note over Client: Process final result\r\n        else Task Still Running\r\n            Note over Client: Continue monitoring\r\n        end\r\n    end\r\n```\r\n\r\n### \uc6cc\ud06c\ud50c\ub85c\uc6b0 \ub2e8\uacc4\r\n\r\n1. **\ud0dc\uc2a4\ud06c \uc81c\ucd9c**: \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 `todolist` \ud14c\uc774\ube14\uc5d0 \uc0c8\ub85c\uc6b4 \uc791\uc5c5\uc744 INSERT\r\n2. **\ud3f4\ub9c1**: ProcessGPT Agent Server\uac00 \uc8fc\uae30\uc801\uc73c\ub85c `pending` \uc0c1\ud0dc\uc758 \uc791\uc5c5\ub4e4\uc744 \uc870\ud68c\r\n3. **\uc0c1\ud0dc \uc5c5\ub370\uc774\ud2b8**: \ubc1c\uacac\ub41c \uc791\uc5c5\uc758 \uc0c1\ud0dc\ub97c `in_progress`\ub85c \ubcc0\uacbd\r\n4. **\ucee8\ud14d\uc2a4\ud2b8 \uc0dd\uc131**: todolist \ub370\uc774\ud130\ub97c \uae30\ubc18\uc73c\ub85c `ProcessGPTRequestContext` \uc0dd\uc131\r\n5. **\uc774\ubca4\ud2b8 \ud050 \uc0dd\uc131**: Supabase \uc5f0\ub3d9 `ProcessGPTEventQueue` \uc0dd\uc131\r\n6. **\uc5d0\uc774\uc804\ud2b8 \uc2e4\ud589**: Google A2A SDK \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud1b5\ud574 AI \ud504\ub808\uc784\uc6cc\ud06c(CrewAI, Langgraph, OpenAI) \ud638\ucd9c\r\n7. **\uc774\ubca4\ud2b8 \ub85c\uae45**: \uc2e4\ud589 \uacfc\uc815\uc758 \ubaa8\ub4e0 \uc774\ubca4\ud2b8\uac00 `events` \ud14c\uc774\ube14\uc5d0 \uc800\uc7a5\r\n8. **\uc644\ub8cc \ucc98\ub9ac**: \ucd5c\uc885 \uacb0\uacfc\uac00 `todolist`\uc758 `agent_output`\uc5d0 \uc800\uc7a5\r\n\r\n## \ud83d\udee0\ufe0f \ucee4\uc2a4\ud130\ub9c8\uc774\uc81c\uc774\uc158\r\n\r\n### \uc0c8\ub85c\uc6b4 \uc5d0\uc774\uc804\ud2b8 \ud0c0\uc785 \ucd94\uac00\r\n\r\n1. `AgentExecutor`\ub97c \uc0c1\uc18d\ubc1b\ub294 \uc0c8\ub85c\uc6b4 \ud074\ub798\uc2a4 \uc0dd\uc131:\r\n\r\n```python\r\nfrom a2a.server.agent_execution import AgentExecutor, RequestContext\r\nfrom a2a.server.events import EventQueue\r\n\r\nclass MyCustomAgentExecutor(AgentExecutor):\r\n    async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:\r\n        # \uc5d0\uc774\uc804\ud2b8 \ub85c\uc9c1 \uad6c\ud604\r\n        pass\r\n    \r\n    async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:\r\n        # \ucde8\uc18c \ub85c\uc9c1 \uad6c\ud604\r\n        pass\r\n```\r\n\r\n2. \uc0c8\ub85c\uc6b4 \uc11c\ubc84 \uc2a4\ud06c\ub9bd\ud2b8 \uc0dd\uc131:\r\n\r\n```python\r\nfrom processgpt_agent_framework import ProcessGPTAgentServer\r\nfrom my_custom_agent_executor import MyCustomAgentExecutor\r\n\r\nagent_executor = MyCustomAgentExecutor()\r\nserver = ProcessGPTAgentServer(\r\n    agent_executor=agent_executor,\r\n    agent_type=\"my-custom-agent\"\r\n)\r\n\r\nasyncio.run(server.run())\r\n```\r\n\r\n### RequestContext \ud655\uc7a5\r\n\r\n\uae30\ubcf8 `ProcessGPTRequestContext`\ub97c \uc0c1\uc18d\ubc1b\uc544 \ucd94\uac00 \uae30\ub2a5\uc744 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:\r\n\r\n```python\r\nclass ExtendedRequestContext(ProcessGPTRequestContext):\r\n    def __init__(self, todolist_item: TodoListItem):\r\n        super().__init__(todolist_item)\r\n        # \ucd94\uac00 \ucd08\uae30\ud654 \ub85c\uc9c1\r\n    \r\n    def get_custom_data(self):\r\n        # \ucee4\uc2a4\ud140 \ub370\uc774\ud130 \ubc18\ud658 \ub85c\uc9c1\r\n        return self.todolist_item.input_data.get('custom_field')\r\n```\r\n\r\n## \ud83d\udcca \ubaa8\ub2c8\ud130\ub9c1\r\n\r\n\uc2dc\uc2a4\ud15c \uc0c1\ud0dc\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud558\uae30 \uc704\ud55c \uc720\ud2f8\ub9ac\ud2f0:\r\n\r\n```python\r\nfrom processgpt_utils import ProcessGPTMonitor\r\n\r\nmonitor = ProcessGPTMonitor(supabase)\r\n\r\n# \uc2dc\uc2a4\ud15c \ud1b5\uacc4 \uc870\ud68c\r\nstats = await monitor.get_system_stats()\r\nprint(f\"Total tasks: {stats['total_tasks']}\")\r\nprint(f\"Pending: {stats['pending_tasks']}\")\r\nprint(f\"Completed: {stats['completed_tasks']}\")\r\n\r\n# \ucd5c\uadfc \uc774\ubca4\ud2b8 \uc870\ud68c\r\nrecent_events = await monitor.get_recent_events(limit=10)\r\n```\r\n\r\n## \ud83d\udd27 \uc124\uc815 \uc635\uc158\r\n\r\n### \ud658\uacbd\ubcc0\uc218\r\n\r\n```bash\r\n# Supabase \uc124\uc815\r\nSUPABASE_URL=https://your-project.supabase.co\r\nSUPABASE_ANON_KEY=your-anon-key-here\r\n\r\n# \uc5d0\uc774\uc804\ud2b8 \uc124\uc815\r\nDEFAULT_AGENT_TYPE=crew-ai-dr\r\nDEFAULT_POLLING_INTERVAL=5\r\n\r\n# \ub85c\uae45\r\nLOG_LEVEL=INFO\r\n```\r\n\r\n### \uc11c\ubc84 \uc635\uc158\r\n\r\n```bash\r\n# \ud3f4\ub9c1 \uac04\uaca9 \uc124\uc815 (\ucd08)\r\npython server.py --polling-interval 10\r\n\r\n# \ud2b9\uc815 \uc5d0\uc774\uc804\ud2b8 \ud0c0\uc785\ub9cc \ucc98\ub9ac\r\npython server.py --agent-type my-custom-agent\r\n```\r\n\r\n## \ud83d\udc1b \ud2b8\ub7ec\ube14\uc288\ud305\r\n\r\n### \uc77c\ubc18\uc801\uc778 \ubb38\uc81c\ub4e4\r\n\r\n1. **Supabase \uc5f0\uacb0 \uc2e4\ud328**\r\n   - \ud658\uacbd\ubcc0\uc218 `SUPABASE_URL`\uacfc `SUPABASE_ANON_KEY` \ud655\uc778\r\n   - \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \uc0c1\ud0dc \ud655\uc778\r\n\r\n2. **\ud3f4\ub9c1\uc774 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc74c**\r\n   - \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud14c\uc774\ube14\uc774 \uc62c\ubc14\ub974\uac8c \uc0dd\uc131\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\r\n   - `agent_type`\uc774 \uc815\ud655\ud788 \ub9e4\uce6d\ub418\ub294\uc9c0 \ud655\uc778\r\n\r\n3. **\uc774\ubca4\ud2b8\uac00 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc74c**\r\n   - Supabase RLS (Row Level Security) \uc815\ucc45 \ud655\uc778\r\n   - \ud14c\uc774\ube14 \uad8c\ud55c \uc124\uc815 \ud655\uc778\r\n\r\n### \ub85c\uadf8 \ud655\uc778\r\n\r\n```bash\r\n# \ub514\ubc84\uadf8 \ubaa8\ub4dc\ub85c \uc2e4\ud589\r\nLOG_LEVEL=DEBUG python server.py\r\n```\r\n\r\n## \ud83e\udd1d \uae30\uc5ec\r\n\r\n1. Fork the repository\r\n2. Create a feature branch\r\n3. Commit your changes\r\n4. Push to the branch\r\n5. Create a Pull Request\r\n\r\n## \ud83d\udcc4 \ub77c\uc774\uc120\uc2a4\r\n\r\nMIT License - \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 LICENSE \ud30c\uc77c\uc744 \ucc38\uc870\ud558\uc138\uc694.\r\n\r\n## \ud83d\udd17 \uad00\ub828 \ub9c1\ud06c\r\n\r\n- [Google A2A SDK Documentation](https://developers.google.com/a2a)\r\n- [Supabase Documentation](https://supabase.com/docs)\r\n- [ProcessGPT Framework Issues](https://github.com/your-repo/issues) \r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Supabase \uae30\ubc18 \uc774\ubca4\ud2b8/\uc791\uc5c5 \ud3f4\ub9c1\uc73c\ub85c A2A AgentExecutor\ub97c \uc2e4\ud589\ud558\ub294 SDK",
    "version": "0.2.7",
    "project_urls": {
        "Homepage": "https://github.com/your-org/process-gpt-agent-sdk",
        "Issues": "https://github.com/your-org/process-gpt-agent-sdk/issues"
    },
    "split_keywords": [
        "agent",
        " a2a",
        " supabase",
        " workflow",
        " sdk",
        " processgpt"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "97fdda1e1a9bdc70bedc121601e0b319c2ef85201af997907e94cb9496208b4d",
                "md5": "812058aaaa9fcefb188a8bcf74275d61",
                "sha256": "c6e45439d2fb8d9891c5d4d07d24a1421dbb2a94fddee8f76cfb7f741446cf4d"
            },
            "downloads": -1,
            "filename": "process_gpt_agent_sdk-0.2.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "812058aaaa9fcefb188a8bcf74275d61",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 32814,
            "upload_time": "2025-08-28T03:27:57",
            "upload_time_iso_8601": "2025-08-28T03:27:57.953782Z",
            "url": "https://files.pythonhosted.org/packages/97/fd/da1e1a9bdc70bedc121601e0b319c2ef85201af997907e94cb9496208b4d/process_gpt_agent_sdk-0.2.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f1b6c5df0d6513b619422a06b7d4004b4ac2647dc65fc76690401a9cb06209b8",
                "md5": "039c1bc569a62bd3161a1132c1732663",
                "sha256": "42ae5f061435570e759b033ee463285f38497f4717a0038b9c605ae96e8aa628"
            },
            "downloads": -1,
            "filename": "process_gpt_agent_sdk-0.2.7.tar.gz",
            "has_sig": false,
            "md5_digest": "039c1bc569a62bd3161a1132c1732663",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 29761,
            "upload_time": "2025-08-28T03:27:59",
            "upload_time_iso_8601": "2025-08-28T03:27:59.209058Z",
            "url": "https://files.pythonhosted.org/packages/f1/b6/c5df0d6513b619422a06b7d4004b4ac2647dc65fc76690401a9cb06209b8/process_gpt_agent_sdk-0.2.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-28 03:27:59",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "your-org",
    "github_project": "process-gpt-agent-sdk",
    "github_not_found": true,
    "lcname": "process-gpt-agent-sdk"
}
        
Elapsed time: 0.91603s