Schema Idea
All checks were successful
Build and push Docker image at git tag / build (push) Successful in 44s

This commit is contained in:
2024-10-30 21:07:54 +01:00
parent 786a230e78
commit f2f9819d27
10 changed files with 1452 additions and 674 deletions

View File

@ -1,13 +1,25 @@
# Agenten Plattform
#
# (c) 2024 Magnus Bender
# Institute of Humanities-Centered Artificial Intelligence (CHAI)
# Universitaet Hamburg
# https://www.chai.uni-hamburg.de/~bender
#
# source code released under the terms of GNU Public License Version 3
# https://www.gnu.org/licenses/gpl-3.0.txt
import random
import random, os, json
from abc import abstractmethod, ABC
from enum import Enum
from typing import List, Callable
from pydantic import validate_call
from ums.utils import (
RiddleInformation, AgentMessage, RiddleDataType, RiddleData, Riddle,
RiddleStatus, RiddleSolution,
ExtractedData,
logger
)
@ -34,6 +46,7 @@ class BasicAgent(ABC):
"""
pass
@validate_call
def __init__(self, message:AgentMessage, send_message:Callable[[AgentMessage], bool]):
self._send_message = send_message
self._sub_cnt = 0
@ -57,7 +70,8 @@ class BasicAgent(ABC):
logger.debug(f"Response sent {self._response.id}")
else:
logger.debug(f"Stopped response {self._response.id}")
@validate_call
def before_response(self, response:AgentMessage, send_it:Callable[[], None]) -> bool:
"""
This method is called before the response is sent.
@ -69,12 +83,14 @@ class BasicAgent(ABC):
"""
return True
@validate_call
def message(self) -> AgentMessage:
"""
Get the message this agent object is working on.
"""
return self._message;
@validate_call
def sub_riddle(self,
riddle:Riddle, data:List[RiddleData]=[], status:RiddleStatus=None
) -> AgentMessage|bool:
@ -122,6 +138,21 @@ class BasicAgent(ABC):
"""
pass
@validate_call
def get_extracted(self, data:RiddleData) -> ExtractedData|None:
"""
Loads the extracted data from the `data` item (i.e., from the file `data.file_extracted`).
Returns None if no extracted data found.
"""
if not data.file_extracted is None:
return ExtractedData.model_validate(
json.load(open(data.file_extracted, 'r'))
)
return None
class ExtractAgent(BasicAgent):
"""
An extraction agent.
@ -154,11 +185,33 @@ class ExtractAgent(BasicAgent):
self._response.status.extract.finished = True
@abstractmethod
@validate_call
def handle(self, data:RiddleData) -> RiddleData:
"""
Process the item `data`, create extraction file and return `data` with populated `data.file_extracted`.
"""
@validate_call
def store_extracted(self, data:RiddleData, extracted:ExtractedData) -> str:
"""
Stores the newly extracted data (in `extracted`) from `data` (i.e., `data.file_plain`)
and returns the filename to use in `data.file_extracted`.
"""
path_name = data.file_plain[:data.file_plain.rfind('.')]
candidate = "{}.json".format(path_name)
cnt = 0
while os.path.isfile(candidate):
cnt += 1
candidate = "{}-{}.json".format(path_name, cnt)
with open(candidate, 'w+') as f:
f.write(extracted.model_dump_json())
return candidate
class ExtractTextAgent(ExtractAgent):
"""
An extraction agent for text, create a subclass for your agent.
@ -206,7 +259,8 @@ class SolveAgent(BasicAgent):
self._do_response = True
@abstractmethod
def handle(self, riddle:Riddle, data:RiddleData) -> RiddleSolution:
@validate_call
def handle(self, riddle: Riddle, data: List[RiddleData]) -> RiddleSolution:
"""
Solve the `riddle` using `data` and return a solution.
"""
@ -237,6 +291,7 @@ class GatekeeperAgent(BasicAgent):
self._do_response = True
@abstractmethod
@validate_call
def handle(self, solution:RiddleSolution, riddle:Riddle) -> RiddleSolution:
"""
Check the `solution` of `riddle` and return solution with populated `solution.accepted` and `solution.review`.