Compare commits

..

No commits in common. "master" and "v0.7.1" have entirely different histories.

51 changed files with 2608 additions and 5606 deletions

View File

@ -1,4 +1,4 @@
name: Build and push Docker images on git tags
name: Build and push Docker image at git tag
on:
push:
tags:

2
.gitignore vendored
View File

@ -1,9 +1,7 @@
__pycache__
# data of containers
/data/*
# ignore local venv
/bin/
/lib/
/include/

View File

@ -1,39 +1,26 @@
> [!NOTE]
> In diesem Repository befinden sich die Implementierung des Management und der Agenten-Plattform. Sowie Skripte zur Erstellung der Docker-Images.
> [!WARNING]
> Um die Plattform zu benutzen, bitte das [Agent-Template](https://git.chai.uni-hamburg.de/UMS-Agenten/Agent-Template) benutzen!
# Agenten-Plattform
## Management
Verzeichnisse insb.:
- `./utils/mgmt/` Docker container configs
- `./ums/management/` Python source
- `./web/` Jinja templates and web root
- `./build-mgmt.sh` Container build script
- `./docker-mgmt/`
- `./ums/management/`
- `./web/`
- `./build-mgmt.sh`
## Basic Agent
Verzeichnisse insb.:
- `./utils/agent/` Docker container configs
- `./ums/agent/` Python source
- `./build-agent.sh` Container build script
- `./docker-agent/`
- `./ums/agent/`
- `./build-agent.sh`
## Development
### Run via Docker
- `docker compose up`
### CLI Examples
- Requests to management
- `docker compose exec management python -m ums.example` (runs file `ums/example/__main__.py`)
- Run single task in agent
- `docker compose exec agent_all python -m ums.agent -h`
### VS Code Autocomplete
(In VS Code)
### VS Code Autocomplete ...
- `python3 -m venv .` (only once)
- `source ./bin/activate`
- `pip install requests fastapi pdoc` (only once)

View File

@ -35,7 +35,7 @@ for platform in $PLATFORMS; do
docker build \
--pull \
--platform "linux/$platform" \
--file "$SCRIPTPATH/utils/agent/Dockerfile" \
--file "$SCRIPTPATH/docker-agent/Dockerfile" \
--build-arg FROM_IMAGE="$IMAGE_REGISTRY/$IMAGE_OWNER/$IMAGE_AGENT_BASE:$tag" \
--build-arg PIP_REQ_FILE="$requirements" \
--tag "$IMAGE_REGISTRY/$IMAGE_OWNER/$IMAGE_NAME_AGENT:$tag" \
@ -45,6 +45,6 @@ done;
if [ "$requirements" == "requirements.txt" ]; then
# extract requirements-frozen.txt
cid=$(docker create "$IMAGE_REGISTRY/$IMAGE_OWNER/$IMAGE_NAME_AGENT:cpu-arm64")
docker cp "$cid:/ums-agenten/requirements-frozen.txt" "$SCRIPTPATH/utils/agent/requirements-frozen.txt"
docker cp "$cid:/ums-agenten/requirements-frozen.txt" "$SCRIPTPATH/docker-agent/requirements-frozen.txt"
docker rm "$cid"
fi;

View File

@ -29,7 +29,7 @@ for platform in $PLATFORMS; do
docker build \
--pull \
--platform "linux/$platform" \
--file "$SCRIPTPATH/utils/mgmt/Dockerfile" \
--file "$SCRIPTPATH/docker-mgmt/Dockerfile" \
--build-arg H_UID=1050 \
--build-arg PIP_REQ_FILE="$requirements" \
--build-arg H_GID=1050 \
@ -41,6 +41,6 @@ done;
if [ "$requirements" == "requirements.txt" ]; then
# extract requirements-frozen.txt
cid=$(docker create "$IMAGE_REGISTRY/$IMAGE_OWNER/$IMAGE_NAME_MGMT:arm64")
docker cp "$cid:/ums-agenten/requirements.txt" "$SCRIPTPATH/utils/mgmt/requirements-frozen.txt"
docker cp "$cid:/ums-agenten/requirements.txt" "$SCRIPTPATH/docker-mgmt/requirements-frozen.txt"
docker rm "$cid"
fi;

View File

@ -16,12 +16,12 @@ ARG PIP_REQ_FILE
USER root
RUN mkdir -p /ums-agenten/plattform/ && mkdir -p /ums-agenten/persist/
COPY ./utils/agent/$PIP_REQ_FILE /ums-agenten/requirements.txt
COPY ./docker-agent/$PIP_REQ_FILE /ums-agenten/requirements.txt
RUN pip3 install --break-system-packages --no-cache-dir -r /ums-agenten/requirements.txt \
&& pip3 freeze -q -r /ums-agenten/requirements.txt > /ums-agenten/requirements-frozen.txt
# install the code of the repo
COPY ./utils/setup.py /ums-agenten/plattform/
COPY ./docker-mgmt/setup.py /ums-agenten/plattform/
RUN pip3 install --break-system-packages -e /ums-agenten/plattform/
COPY --chown=user:user ./ums/ /ums-agenten/plattform/ums/

View File

@ -20,9 +20,6 @@ services:
- 8000:80
environment:
- SOLUTION_MAX_TRIALS=5
- MESSAGE_MAX_CONTACTS=100
- REQUIRE_FULL_EXTRACT=true
- REQUIRE_FULL_SOLVE=true
- MANAGEMENT_URL=http://management
- AGENTS_PROCESS=http://agent_all:8000
- AGENTS_SOLVE=http://agent_all:8000

View File

@ -38,17 +38,17 @@ RUN ln -s /usr/bin/python3 /usr/local/bin/python \
RUN mkdir -p /ums-agenten/plattform/ && mkdir -p /ums-agenten/persist/
COPY ./utils/mgmt/$PIP_REQ_FILE /ums-agenten/requirements.txt
COPY ./docker-mgmt/$PIP_REQ_FILE /ums-agenten/requirements.txt
RUN pip3 install --break-system-packages --no-cache-dir -r /ums-agenten/requirements.txt \
&& pip3 freeze > /ums-agenten/requirements.txt
# nginx settings and startup
COPY ./utils/mgmt/supervisor.conf /etc/supervisor/supervisord.conf
COPY ./utils/mgmt/nginx.conf /etc/nginx/nginx.conf
COPY ./utils/mgmt/app.conf /etc/nginx/sites-enabled/default
COPY ./docker-mgmt/supervisor.conf /etc/supervisor/supervisord.conf
COPY ./docker-mgmt/nginx.conf /etc/nginx/nginx.conf
COPY ./docker-mgmt/app.conf /etc/nginx/sites-enabled/default
# install the code of the repo
COPY ./utils/setup.py /ums-agenten/plattform/
COPY ./docker-mgmt/setup.py /ums-agenten/plattform/
RUN pip3 install --break-system-packages -e /ums-agenten/plattform/
WORKDIR /ums-agenten/plattform/ums/

View File

@ -29,11 +29,6 @@ server {
try_files $uri $uri/ @dynamic;
}
location /share {
alias /ums-agenten/share;
autoindex on;
}
location @dynamic {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

View File

@ -10,7 +10,7 @@
# source code released under the terms of GNU Public License Version 3
# https://www.gnu.org/licenses/gpl-3.0.txt
pdoc ./ums/ ./ums/example/__main__.py \
pdoc ./ums/ \
--output-directory ./web/public/docs/ \
--no-browser \
--docformat google \

View File

@ -20,26 +20,27 @@ day_tag=$(date '+%Y-%m-%d')
images_a=$(docker image ls "$IMAGE_REGISTRY/$IMAGE_OWNER/$IMAGE_NAME_AGENT" --format '{{.Repository}}:{{.Tag}}')
images_b=$(docker image ls "$IMAGE_REGISTRY/$IMAGE_OWNER/$IMAGE_NAME_MGMT" --format '{{.Repository}}:{{.Tag}}')
echo "$images_a
$images_b" | while read image_url ;
echo "$images_a\n$images_b" | while read image_url ;
do
image_name="${image_url##*/}"
image_name="${image_name%%:*}"
image_tag="${image_url##*:}"
if [[ "$image_tag" =~ ^((gpu-)|(cpu-))?((arm64)|(amd64))$ ]];
echo "URL: $image_url NAME: $image_name TAG: $image_tag"
if [[ "$image_tag" =~ ^((gpu)|(cpu)-)?((arm64)|(amd64))$ ]];
then
echo "Push:"
echo " $IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag"
echo " $IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag-$day_tag"
docker push "$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag"
#docker push "$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag"
docker tag "$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag" \
"$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag-$day_tag"
#docker tag "$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag" \
# "$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag-$day_tag"
docker push "$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag-$day_tag"
#docker push "$IMAGE_REGISTRY/$IMAGE_OWNER/$image_name:$image_tag-$day_tag"
fi;
done

View File

@ -7,28 +7,3 @@
#
# source code released under the terms of GNU Public License Version 3
# https://www.gnu.org/licenses/gpl-3.0.txt
"""
The package `ums` contains the Agenten-Plattform, the implementations of the agents shall be created in the package `src`, see [Agent-Template](https://git.chai.uni-hamburg.de/UMS-Agenten/Agent-Template).
> Side note: The classes with comments may be useful when implementing the agents.
> The classes without comments may be safe to ignore and are (only) used internally.
- `ums.agent`
- Contains the implementation of an agent for handling requests by the implementations in `src`.
- Check for running single tasks without using management.
- `ums.example`
- Contains a very simple examples for all types of agents.
- See `ums.example.example`
- `ums.management`
- Contains the implementation of the management.
- Take a look at the web gui of the management, possibly at <http://localhost:8080/> or <http://localhost:8000/>
- `ums.utils`
- Contains various utilities.
- `ums.utils.const.SHARE_PATH` The path for shared files between all agents
- `ums.utils.const.PERSIST_PATH` The path to store persistent data of an agent
- `ums.utils.request.ManagementRequest` Run request to the management (only necessary in special cases, most requests done automatically by platform)
- `ums.utils.schema` The schema (types) used in the files storing extracted data from plain data
- `ums.utils.types` The types used in the communication between agent and management
"""

View File

@ -8,41 +8,6 @@
# source code released under the terms of GNU Public License Version 3
# https://www.gnu.org/licenses/gpl-3.0.txt
"""
## Run as Agent
The env. variable `AGENTS_LIST` is used to identify the agents classes/ task handlers.
It must contain he the package name and a variable name in this package divided by `:`.
Then, the variable contains a list of agent classes (subclasses of `ums.agent.agent.BasicAgent`)
For example `AGENTS_LIST=ums.example.example:AGENT_CLASSES`, then in file `./ums/example/example.py` a variable `AGENT_CLASSES` exists.
One line in this file, e.g., is `AGENT_CLASSES = [MyExtractAudioAgent, MyExtractImageAgent]`.
When starting the Docker container of the agent, the classes specified in `AGENTS_LIST` are loaded and if the agent receives a task, the task is sent to the agent classes' `handle` methods.
## Run Single Task
For development it might be cumbersome to always require a running management container and sending messages.
Hence, tasks can be run manually from the terminal (still in the container and using the agent classes), but without having a management.
This also uses the `AGENTS_LIST` env. variable, but the tasks are sent via command line:
There are three ways to send a task (if the agent's Docker container is running):
- `docker compose exec agent_all python -m ums.agent -d`
- Run a dummy task
- Possibly `agent_all` needs to be changed to the service name (see `docker-compose.yml`) of the agent's Docker container
- `cat ./msg.json | docker compose exec -T agent_all python -m ums.agent -i`
- Send the task (json of `AgentMessage`) via STDIN from file `./msg.json` to the agent
- `docker compose exec agent_all python -m ums.agent -f msg.json`
- Get the task from the json file, the files are searched for by full name, in the shared, and the persistent directory.
If the Agent's Docker container is not running, a temporary container can be started.
For the dummy message, the command would be `docker compose run --rm --entrypoint "" agent_all python -m ums.agent -d`.
(Again, change `agent_all` for the service name in `docker-compose.yml`.)
"""
from ums.agent.agent import (
AgentCapability,
BasicAgent,

View File

@ -1,65 +0,0 @@
# 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 argparse, sys, os, json
from ums.agent.process import MessageProcessor
from ums.utils import AgentMessage, Riddle, SHARE_PATH, PERSIST_PATH
class _FakeBackgroundTask():
def add_task(self, call, *args):
call(*args)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Agenten Plattform Run Single Task')
parser.add_argument('-f', '--file', help="fetch the message (riddle) from this json file")
parser.add_argument('-d', '--dummy', help="use a dummy message (riddle)", action="store_true")
parser.add_argument('-i', '--stdin', help="get the message (riddle) from STDIN", action="store_true")
args = parser.parse_args()
message = None
if args.dummy:
message = AgentMessage(
id="dummy",
riddle=Riddle(context="Its a dummy.", question="No question!")
)
message.status.extract.required = False
elif args.stdin:
text = ''.join(sys.stdin.readlines())
message = AgentMessage.model_validate_json(text)
elif args.file:
if os.path.isfile(args.file):
f_name = args.file
elif os.path.isfile(os.path.join(SHARE_PATH, args.file)):
f_name = os.path.join(SHARE_PATH, args.file)
elif os.path.isfile(os.path.join(PERSIST_PATH, args.file)):
f_name = os.path.join(PERSIST_PATH, args.file)
else:
print()
print(f"\tFile {args.file} not found!")
print()
f_name = None
if not f_name is None:
message = AgentMessage.model_validate(
json.load(open(f_name, 'r'))
)
if message is None:
parser.print_help()
else:
mp = MessageProcessor(disable_messages=True)
response = mp.new_message(message, _FakeBackgroundTask())
print("\tResponse:")
print(response.model_dump_json(indent=2))

View File

@ -1,25 +1,13 @@
# 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, os, json, time
import random
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
)
@ -46,7 +34,6 @@ 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
@ -64,10 +51,6 @@ class BasicAgent(ABC):
pass
def _respond(self):
# do a very short sleep
time.sleep(random.random())
# sending
send_it = lambda: self._send_message(self._response)
if self.before_response(self._response, send_it) and self._do_response:
send_it()
@ -75,7 +58,6 @@ class BasicAgent(ABC):
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.
@ -87,14 +69,12 @@ 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:
@ -142,21 +122,6 @@ 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.
@ -189,56 +154,11 @@ 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, allow_overwrite:bool=True) -> 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`.
If there already exists an extracted file for this `data`, the file will be overwritten if `allow_overwrite=True`.
Generally the system will check, if the contents of the current file are equal to the contents to write.
File with equal content will not be written again.
"""
# get path and name
path_name = data.file_plain[:data.file_plain.rfind('.')]
candidate = "{}.json".format(path_name)
# data to write
data = extracted.model_dump_json()
# check for file
if os.path.isfile(candidate):
# get current content
with open(candidate, 'r') as f:
content = f.read()
# files equal -> no need to rewrite
if content == data:
return candidate
# not equal and overwrite not allowed
elif not allow_overwrite:
# get non-existent file name
cnt = 0
while os.path.isfile(candidate):
cnt += 1
candidate = "{}-{}.json".format(path_name, cnt)
# write file
with open(candidate, 'w+') as f:
f.write(data)
return candidate
class ExtractTextAgent(ExtractAgent):
"""
An extraction agent for text, create a subclass for your agent.
@ -280,16 +200,15 @@ class SolveAgent(BasicAgent):
if len(solution.solution) == 0 or len(solution.explanation) == 0:
logger.info(f"Riddle {self._response.id}: Empty solution/ explanation after handling")
self._response.solution.append(solution)
self._response.solution = solution
self._response.status.solve.finished = True
self._do_response = True
@abstractmethod
@validate_call
def handle(self, riddle: Riddle, data: List[RiddleData]) -> RiddleSolution:
def handle(self, riddle:Riddle, data:RiddleData) -> RiddleSolution:
"""
Solve the `riddle` using `data` and return a single solution.
Solve the `riddle` using `data` and return a solution.
"""
class GatekeeperAgent(BasicAgent):
@ -301,26 +220,24 @@ class GatekeeperAgent(BasicAgent):
return AgentCapability.GATEKEEPER
def _process(self):
if len(self._response.solution) == 0:
self._response.solution.append(RiddleSolution(solution="", explanation=""))
if self._response.solution is None:
self._response.solution = RiddleSolution(solution="", explanation="")
logger.debug(f"Start validate: {self._response.id}")
solution = self.handle(self._response.solution, self._response.riddle)
logger.debug(f"End validate: {self._response.id} ({solution.review}, {solution.accepted})")
for single_solution in solution:
logger.debug(f"End validate: {self._response.id} ({single_solution.review}, {single_solution.accepted})")
if single_solution.review is None or len(single_solution.review) == 0:
logger.info(f"Riddle {self._response.id}: Empty review after handling")
if solution.review is None or len(solution.review) == 0:
logger.info(f"Riddle {self._response.id}: Empty review after handling")
self._response.solution = solution
self._response.status.validate.finished = True
self._response.status.solved = any(single_solution.accepted for single_solution in solution)
self._response.status.solved = solution.accepted
self._do_response = True
@abstractmethod
@validate_call
def handle(self, solution:List[RiddleSolution], riddle:Riddle) -> List[RiddleSolution]:
def handle(self, solution:RiddleSolution, riddle:Riddle) -> RiddleSolution:
"""
Check the `solution` (multiple if multiple solver involved) of `riddle` and return solutions with populated `solution[i].accepted` and `solution[i].review`.
Check the `solution` of `riddle` and return solution with populated `solution.accepted` and `solution.review`.
"""

View File

@ -60,6 +60,6 @@ class WebMain():
def message(request: Request, message:AgentMessage, background_tasks: BackgroundTasks) -> AgentResponse:
return self.msg_process.new_message(message, background_tasks)
if __name__ == "ums.agent.main" and os.environ.get('SERVE', 'false').lower() == 'true':
if __name__ == "ums.agent.main" and os.environ.get('SERVE', 'false') == 'true':
main = WebMain()
app = main.app

View File

@ -22,9 +22,8 @@ class MessageProcessor():
MANAGEMENT_URL = os.environ.get('MANAGEMENT_URL', 'http://127.0.0.1:80').strip().strip('/')
AGENTS_LIST = os.environ.get('AGENTS_LIST', 'ums.example.example:AGENT_CLASSES').strip()
def __init__(self, disable_messages:bool=False):
def __init__(self):
self.counts = 0
self.disable_messages = disable_messages
module_name, var_name = self.AGENTS_LIST.split(':')
agents_module = importlib.import_module(module_name)
@ -83,18 +82,14 @@ class MessageProcessor():
)
def _send_message(self, message:AgentMessage) -> bool:
if not self.disable_messages:
r = requests.post(
"{}/message".format(self.MANAGEMENT_URL),
data=message.model_dump_json(),
headers={"accept" : "application/json", "content-type" : "application/json"}
)
r = requests.post(
"{}/message".format(self.MANAGEMENT_URL),
data=message.model_dump_json(),
headers={"accept" : "application/json", "content-type" : "application/json"}
)
if r.status_code == 200:
return True
else:
logger.warning(f"Error sending message to management! {(r.text, r.headers)}")
return False
if r.status_code == 200:
return True
else:
print("\tMessages disabled: Requested to send message to management:")
print(message.model_dump_json(indent=2))
logger.warning(f"Error sending message to management! {(r.text, r.headers)}")
return False

View File

@ -8,53 +8,35 @@
# source code released under the terms of GNU Public License Version 3
# https://www.gnu.org/licenses/gpl-3.0.txt
"""
See the source &rarr;
"""
if __name__ == "__main__":
from ums.utils import ManagementRequest
## Example: Sending messages to management via python
m_request = ManagementRequest()
from ums.utils import AgentMessage, RiddleData, RiddleDataType, RiddleSolution, ManagementRequest
# get infos from Management
print(
# message number 12
m_request.get_message(count=12)
)
print(
# first two messages of id "test"
m_request.list_messages(id="test", limit=2)
)
print(
# count messages with id "test"
m_request.total_messages(id="test")
)
from ums.utils import AgentMessage, Riddle, RiddleData, RiddleDataType, RiddleSolution
# send messages to management
# basic message
msg = AgentMessage(
id="example",
riddle=Riddle(context="Today is the 1. January 1970", question="What time is it?"),
ex = AgentMessage(
id="ex5",
riddle={
"context":"Example 1",
"question":"Get the name of the person."
},
data=[
RiddleData(
type=RiddleDataType.TEXT,
file_plain="./cv.txt" # make sure this file exists!
file_plain="./cv.txt"
)
]
)
# disable some steps
msg.status.extract.required = False
msg.status.validate.required = False
ex.status.extract.required = False
print(
# send the message
m_request.send_message(msg)
ex.solution = RiddleSolution(
solution="Otto",
explanation="Written in line 6 after 'Name:'"
)
mr = ManagementRequest("localhost")
print(mr.send_message(ex))
print(mr.get_status(20))

View File

@ -8,12 +8,10 @@
# source code released under the terms of GNU Public License Version 3
# https://www.gnu.org/licenses/gpl-3.0.txt
import random
from typing import Callable, List
from typing import Callable
from ums.agent import ExtractAudioAgent, ExtractImageAgent, ExtractTextAgent, SolveAgent, GatekeeperAgent
from ums.utils import AgentMessage, Riddle, RiddleData, RiddleSolution, RiddleStatus, ExtractedData
from ums.utils.types import AgentMessage, Riddle, RiddleData, RiddleSolution, RiddleStatus
"""
Examples for simple agents.
@ -33,9 +31,6 @@ class MyExtractImageAgent(ExtractImageAgent):
def handle(self, data: RiddleData) -> RiddleData:
print("Image Process:", data.file_plain)
extracted = ExtractedData(other={"info":"just a test"})
data.file_extracted = self.store_extracted(data, extracted)
return data
class MyExtractTextAgent(ExtractTextAgent):
@ -51,24 +46,21 @@ class MyExtractTextAgent(ExtractTextAgent):
class MySolveAgent(SolveAgent):
def handle(self, riddle: Riddle, data: List[RiddleData]) -> RiddleSolution:
for d in data:
print(self.get_extracted(d))
def handle(self, riddle: Riddle, data: RiddleData) -> RiddleSolution:
if self.message().id == "test":
status = RiddleStatus()
status.extract.required = False
self.sub_riddle(riddle=Riddle(context="Haha", question="Blubber"), status=status)
return RiddleSolution(solution="Huii", explanation=f"Blubb, {random.random()}")
return RiddleSolution(solution="Huii", explanation="Blubb")
class MyGatekeeperAgent(GatekeeperAgent):
def handle(self, solution: List[RiddleSolution], riddle: Riddle) -> RiddleSolution:
solution[0].accepted = True
solution[0].review = "Ok"
def handle(self, solution: RiddleSolution, riddle: Riddle) -> RiddleSolution:
solution.accepted = True
solution.review = "Ok"
return solution

View File

@ -26,8 +26,7 @@ class DB():
def __init__(self):
self.db = sqlite3.connect(
os.path.join(PERSIST_PATH, 'messages.db'),
check_same_thread=False,
autocommit=False
check_same_thread=False
)
self.db.row_factory = sqlite3.Row
atexit.register(lambda db : db.close(), self.db)
@ -145,7 +144,7 @@ class DB():
yield count['count']
else:
for row in self.db.execute(
"SELECT * FROM Messages {} ORDER BY time DESC, count DESC LIMIT :lim OFFSET :off".format(where_clause),
"SELECT * FROM Messages {} ORDER BY time DESC LIMIT :lim OFFSET :off".format(where_clause),
params
):
yield self._create_row_object(row, allow_lazy=True)
@ -193,3 +192,5 @@ class DB():
)
except:
return None

View File

@ -31,7 +31,7 @@ class Interface():
self.router = APIRouter(
prefix=self._PREFIX,
tags=["gui"]
tags=["app, gui"]
)
self._add_routes()

View File

@ -10,7 +10,6 @@
import os
from typing import List
from datetime import datetime
from fastapi import FastAPI, Request, BackgroundTasks, HTTPException
@ -79,7 +78,7 @@ class WebMain():
{"request" : request}
)
@self.app.post("/message", summary="Send a message to the management", tags=['agents'])
@self.app.post("/message", summary="Send a message to the management")
def message(request: Request, message:AgentMessage, background_tasks: BackgroundTasks) -> AgentResponse:
receiver = request.headers['host']
@ -90,29 +89,7 @@ class WebMain():
return self.msg_process.new_message(sender, receiver, message, background_tasks)
@self.app.get("/list", summary="Get list of messages (like table)", tags=["cli, agents"])
def list(id:str|None=None, sender:str|None=None, recipient:str|None=None,
processed:bool|None=None, solution:bool|None=None,
time_after:int|None=None, time_before:int|None=None,
limit:int=10, offset:int=0
) -> List[MessageDbRow]:
db_args = {
"limit" : limit,
"offset" : offset
}
for v,n in (
(id,'id'), (sender,'sender'), (recipient,'recipient'),
(processed,'processed'), (solution,'solution'),
(time_after, 'time_after'), (time_before, 'time_before')
):
if not v is None:
db_args[n] = v
return [row for row in self.db.iterate(**db_args)]
@self.app.get("/list/single", summary="Get a single message", tags=["cli, agents"])
@self.app.get("/status", summary="Get status of a message")
def status(count:int) -> MessageDbRow:
msg = self.db.by_count(count)
if msg is None:
@ -120,6 +97,6 @@ class WebMain():
return msg
if __name__ == "ums.management.main" and os.environ.get('SERVE', 'false').lower() == 'true':
if __name__ == "ums.management.main" and os.environ.get('SERVE', 'false') == 'true':
main = WebMain()
app = main.app

View File

@ -15,15 +15,11 @@ import requests
from fastapi import BackgroundTasks
from ums.management.db import DB
from ums.utils import AgentMessage, AgentResponse, logger, RiddleData, RiddleSolution
from ums.utils import AgentMessage, AgentResponse, logger
class MessageProcessor():
SOLUTION_MAX_TRIALS = int(os.environ.get('SOLUTION_MAX_TRIALS', 5))
MESSAGE_MAX_CONTACTS = int(os.environ.get('MESSAGE_MAX_CONTACTS', 100))
REQUIRE_FULL_EXTRACT = os.environ.get('REQUIRE_FULL_EXTRACT', 'false').lower() == 'true'
REQUIRE_FULL_SOLVE = os.environ.get('REQUIRE_FULL_SOLVE', 'false').lower() == 'true'
MANAGEMENT_URL = os.environ.get('MANAGEMENT_URL', 'http://127.0.0.1:80').strip().strip('/')
@ -82,133 +78,37 @@ class MessageProcessor():
# do not process processed messages again
return
# now message processed!
self.db.set_processed(count=count, processed=True)
# increment contacts counter
db_message.message.contacts += 1
if db_message.message.contacts > self.MESSAGE_MAX_CONTACTS:
logger.warning(f"Message reached max number of contacts! {db_message.message.id}, {count}")
return
# check which step/ state the message requires the management to do
# -> IF
if db_message.message.status.extract.required and not db_message.message.status.extract.finished:
# send to extract agents
self._send_messages(self.AGENTS_PROCESS, db_message.message)
return
# combine different extractions in data items
# will update items in `db_message.message.data`
fully_extracted = self._add_extractions(db_message.message.id, db_message.message.data)
if self.REQUIRE_FULL_EXTRACT and not fully_extracted:
logger.warning(f"Postpone message, wait for full extract of items! {db_message.message.id}, {count}")
return
# -> EL IF
if db_message.message.status.solve.required and not db_message.message.status.solve.finished:
elif db_message.message.status.solve.required and not db_message.message.status.solve.finished:
# send to solve agents
self._send_messages(self.AGENTS_SOLVE, db_message.message)
return
# combine different solutions
# will add solutions received before to `db_message.message.solution`
fully_solved = self._add_solutions(db_message.message.id, db_message.message.solution, db_message.message.status.trial)
if self.REQUIRE_FULL_SOLVE and not fully_solved:
logger.warning(f"Postpone message, wait for all solutions of riddle! {db_message.message.id}, {count}")
return
# -> EL IF
if db_message.message.status.validate.required and not db_message.message.status.validate.finished:
elif db_message.message.status.validate.required and not db_message.message.status.validate.finished:
# send to solve agents
self._send_messages(self.AGENTS_GATEKEEPER, db_message.message)
return
# -> ELSE
# all steps "done"
else: # all steps "done"
# validate not required? (then solved will never be set to true, thus set it here)
if not db_message.message.status.validate.required:
db_message.message.status.solved = True
# validate not required? (then solved will never be set to true, thus set it here)
if not db_message.message.status.validate.required:
db_message.message.status.solved = True
if db_message.message.status.solved:
# yay, message is solved
self.db.set_solution(count=count, solution=True);
else:
# not solved, but all steps done
self.db.set_solution(count=count, solution=False);
if db_message.message.status.solved:
# yay, message is solved
self.db.set_solution(count=count, solution=True);
else:
# not solved, but all steps done
self.db.set_solution(count=count, solution=False);
# try again
self._do_again(db_message.message)
# try again
self._do_again(db_message.message)
def _hash_solution(self, s:RiddleSolution) -> int:
return hash((s.solution, s.explanation, tuple((d.file_plain, d.type) for d in s.used_data)))
def _add_solutions(self, riddle_id:str, solution:List[RiddleSolution], trial:int) -> bool:
# do not do anything, if all solutions available
if len(solution) >= len(self.AGENTS_SOLVE):
return True
contained = set(self._hash_solution(s) for s in solution)
# search db for solutions from before
for row in self.db.iterate(
id=riddle_id,
limit=min(self.db.len(id=riddle_id), 250)
):
# make sure to only use solutions from same "trial"
if row.message.status.trial == trial:
for s in row.message.solution:
h = self._hash_solution(s)
if h not in contained:
# add the 'new' solution
solution.append(s)
contained.add(h)
# all solutions found ?
if len(solution) >= len(self.AGENTS_SOLVE):
break
return len(solution) >= len(self.AGENTS_SOLVE)
def _hash_data(self, d:RiddleData) -> int:
return hash((d.file_plain, d.type, d.prompt))
def _add_extractions(self, riddle_id:str, data:List[RiddleData]) -> bool:
# get all the data items without extraction
empty_data = {}
for i, d in enumerate(data):
if d.file_extracted is None:
empty_data[self._hash_data(d)] = i
# do not do anything if fully extracted
if len(empty_data) == 0:
return True
# search db for extractions already available
for row in self.db.iterate(
id=riddle_id,
limit=min(self.db.len(id=riddle_id), 250)
):
# check for required extraction
for d in row.message.data:
# already extracted ?
# extraction file exists ?
# one of the items, we do not have extractions for ?
# the same data item ?
if not d.file_extracted is None \
and not d.file_extracted.startswith("missing:") \
and self._hash_data(d) in empty_data:
# copy the reference to the extracted data
data[empty_data[self._hash_data(d)]].file_extracted = d.file_extracted
# remove from items we need extracted data for
del empty_data[self._hash_data(d)]
# break if all extractions found
if len(empty_data) == 0:
break
return len(empty_data) == 0 # fully extracted
# now message processed!
self.db.set_processed(count=count, processed=True)
def _do_again(self, message:AgentMessage):
if message.status.trial < self.SOLUTION_MAX_TRIALS:
@ -225,20 +125,17 @@ class MessageProcessor():
# increment trial
message.status.trial += 1
# append current solution(s) als old one(s)
if len(message.solution) > 0:
message.riddle.solutions_before.extend(
# append current solution als old one
if not message.solution is None:
message.riddle.solutions_before.append(
message.solution
)
# reset current solution
message.solution = []
message.solution = None
# add the riddle as new to management
self._send_message(self.MANAGEMENT_URL, message)
else:
logger.info(f"Unsolved riddle after max number of trials: {message.id}")
def _send_messages(self, recipients:List[str], message:AgentMessage) -> bool:
ok = True
for r in recipients:

View File

@ -11,7 +11,7 @@
from ums.utils.const import *
import logging, os
if os.environ.get('SERVE', 'false').lower() == 'true':
if os.environ.get('SERVE', 'false') == 'true':
logging.basicConfig(
handlers=[
logging.FileHandler(LOG_FILE),
@ -38,9 +38,3 @@ from ums.utils.types import (
from ums.utils.request import ManagementRequest
from ums.utils.functions import list_shared_data, list_shared_schema
from ums.utils.schema import (
ExtractionSchema,
ExtractedData,
ExtractedContent, ExtractedPositions
)

View File

@ -8,166 +8,38 @@
# source code released under the terms of GNU Public License Version 3
# https://www.gnu.org/licenses/gpl-3.0.txt
"""
Access to the management, e.g., get the list of messages and single messages.
Manually send messages (if necessary, the platforms should do this).
### Example
```python
m_request = ManagementRequest()
m_request.get_message(count=12)
# MessageDbRow(count=12 sender='from' recipient='to' ...
m_request.list_messages(id="test", limit=2)
# [
# MessageDbRow(count=7256, sender='management', ...),
# MessageDbRow(count=7255, sender='management', ...),
# ]
m_request.total_messages(id="test")
# 31
```
See also `ums.example.__main__` and run in Docker via ``docker compose exec management python -m ums.example``
"""
import os
from typing import List, Dict, Any
import requests
from pydantic import validate_call
from ums.utils.types import AgentMessage, AgentResponse, MessageDbRow
class RequestException(Exception):
"""
Raised on http and similar errors.
"""
pass
pass
class ManagementRequest():
MANAGEMENT_URL = os.environ.get('MANAGEMENT_URL', 'http://127.0.0.1:80').strip().strip('/')
def __init__(self, hostname:str, port:int=80):
self.url = "http://{hostname}:{port}".format(hostname=hostname, port=port)
@validate_call
def __init__(self, allow_lazy:bool=True):
"""
If `allow_lazy` is active, the type checking (by pydantic) is less strict.
E.g. it does not require that all files in the data section of messages must exist on the file system.
"""
self._allow_lazy = allow_lazy
self._pydantic_context = {
"require_file_exists": not self._allow_lazy
}
@validate_call
def get_message(self, count:int) -> MessageDbRow:
"""
Get a message (like a table row) from the management by using the `count`.
May raise `RequestException`.
"""
row = self._get_request(
'list/single',
{"count": count}
)
return MessageDbRow.model_validate(
row, context=self._pydantic_context
)
@validate_call
def list_messages(self,
id:str|None=None, sender:str|None=None, recipient:str|None=None,
processed:bool|None=None, solution:bool|None=None,
time_after:int|None=None, time_before:int|None=None,
limit:int=10, offset:int=0
) -> List[MessageDbRow]:
"""
Get the rows in the tables as list of messages.
The arguments are used for filtering.
May raise `RequestException`.
"""
kwargs = locals().copy()
params = {}
for k,v in kwargs.items():
if k not in ('self',) and not v is None:
params[k] = v
rows = self._get_request('list', params)
return [
MessageDbRow.model_validate(
row, context=self._pydantic_context
) for row in rows
]
@validate_call
def total_messages(self,
id:str|None=None, sender:str|None=None, recipient:str|None=None,
processed:bool|None=None, solution:bool|None=None,
time_after:int|None=None, time_before:int|None=None
) -> int:
"""
Get the total number of rows in the tables matching the filters.
May raise `RequestException`.
"""
kwargs = locals().copy()
params = {}
for k,v in kwargs.items():
if k not in ('self',) and not v is None:
params[k] = v
return int(self._get_request('app/table/total', params))
def _get_request(self, endpoint:str, params:Dict[str, Any]):
def get_status(self, count:int) -> MessageDbRow:
r = requests.get(
"{}/{}".format(self.MANAGEMENT_URL, endpoint),
params=params
"{}/status".format(self.url),
params={"count": count}
)
if r.status_code == 200:
return r.json()
return MessageDbRow.model_validate_json(r.text)
else:
raise RequestException(str(r.text)+"\n"+str(r.headers))
raise RequestException(str(r.text)+str(r.headers))
@validate_call
def send_message(self, message:AgentMessage) -> AgentResponse:
"""
Send the `message` to the management and return the management's agent response.
(On error an agent response with error message).
"""
try:
return AgentResponse.model_validate(
self._post_request(
"message",
message.model_dump_json()
)
)
except RequestException as e:
return AgentResponse(
count=-1,
error=True,
error_msg=str(e)
)
def _post_request(self, endpoint:str, data:Dict[str, Any]):
r = requests.post(
"{}/{}".format(self.MANAGEMENT_URL, endpoint),
data=data,
"{}/message".format(self.url),
data=message.model_dump_json(),
headers={"accept" : "application/json", "content-type" : "application/json"}
)
if r.status_code == 200:
return r.json()
return AgentResponse.model_validate_json(r.text)
else:
return RequestException(str(r.text)+"\n"+str(r.headers))
return AgentResponse(count=-1, error=True, error_msg=str(r.text)+str(r.headers))

View File

@ -1,85 +0,0 @@
# 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
"""
This represents the basic types used for representing extracted information from the data.
The types are implemented using [pydantic](https://docs.pydantic.dev/).
It provides validation, allow JSON serialization and works well with [FastAPI](https://fastapi.tiangolo.com/) which is used internally for the http request between the agents and the management.
**This is work in progress!**
"""
from typing import List, Any, Dict
from pydantic import BaseModel
class ExtractionSchema(BaseModel):
"""
This is the basic class used as superclass for all extracted information from data items.
For all the `ExtractionSchema` is is required that the data can be serialized to json.
Thus, mostly only default data types like `int, str, bool, list, dict, tuple` also including `ExtractionSchema` and `RiddleInformation` can be used here!
"""
class ExtractedContent(ExtractionSchema):
"""
An extracted content item.
"""
type : str
"""
The type, as a string, the actual string will depend on the extraction agent.
"""
content : str | Any
"""
The extracted content
"""
class ExtractedPositions(ExtractionSchema):
"""
A position (like time, coordinates, ...) where something was extracted (each position should belong to a content item).
"""
type : str
"""
The type, as a string, the actual string will depend on the extraction agent.
"""
position : str | int | Any
"""
The position, will also depend on the extraction agent.
"""
description : str | Any = None
"""
An optional description for more details.
"""
class ExtractedData(ExtractionSchema):
"""
Contains the extracted items from a data file.
"""
contents : List[ExtractedContent] = []
"""
The extracted contents (i.e., transcriptions etc.), each item here should belong a position item at the same index.
"""
positions : List[ExtractedPositions] = []
"""
The positions of extracted contents, each item here should belong a content item at the same index.
"""
other : Dict[str, Any] = {}
"""
Possibly more data. Use a keywords (depending on agent) and store the data there.
"""

View File

@ -40,13 +40,12 @@
"question": "Get the name of the person.",
"solutions_before": []
},
"solution": [],
"solution": null,
"data": [
{
"type": "text",
"file_plain": "/ums-agenten/share/cv.txt",
"file_extracted": null,
"prompt": null
"file_extracted": null
}
],
"status": {
@ -64,8 +63,7 @@
},
"trial": 0,
"solved": false
},
"contacts": 0
}
}
```
```python
@ -77,20 +75,20 @@
```json
{
...
"solution": [{
"solution": {
"solution": "Otto",
"explanation": "Written in line 6 after 'Name:'",
"used_data": [],
"accepted": false,
"review": null
}],
},
...
}
```
"""
import os, warnings
import os
from enum import Enum
@ -98,22 +96,15 @@ from typing import List, Any
from typing_extensions import Annotated
from pydantic import (
BaseModel,
ValidationError, ValidationInfo,
ValidatorFunctionWrapHandler,
WrapValidator, AfterValidator, BeforeValidator
BaseModel,
ValidationError, ValidationInfo,
ValidatorFunctionWrapHandler
)
from pydantic.functional_validators import WrapValidator, AfterValidator
from ums.utils.const import SHARE_PATH
from ums.utils.schema import ExtractionSchema
class RiddleInformation(BaseModel):
# ignore:
# /usr/local/lib/python3.12/dist-packages/pydantic/_internal/_fields.py:172:
# UserWarning: Field name "validate" in "RiddleStatus" shadows an attribute in parent
# "RiddleInformation"
warnings.filterwarnings('ignore', category=UserWarning, lineno=172, module="pydantic")
"""
This is the basic class used as superclass for all message and infos
about a riddle.
@ -181,10 +172,6 @@ class RiddleData(RiddleInformation):
The file must exist.
"""
prompt: str | ExtractionSchema | None = None
"""
An optional prompt giving more details to the extraction agent, e.g., selecting a type of extraction/ task to do with the data.
"""
class RiddleSolution(RiddleInformation):
@ -268,12 +255,12 @@ class RiddleStatus(RiddleInformation):
"""
The *main* solving step.
`AgentMessage.solution` shall contain an `RiddleSolution` afterwards.
`AgentMessage.solution` shall be an `RiddleSolution` afterwards.
"""
validate: RiddleSubStatus = RiddleSubStatus()
"""
The validation step, i.e., does the gatekeeper accept the solution(s) in `AgentMessage.solution`.
The validation step, i.e., does the gatekeeper accept the solution in `AgentMessage.solution`.
"""
trial: int = 0
@ -284,13 +271,9 @@ class RiddleStatus(RiddleInformation):
solved: bool = False
"""
True, after the gatekeeper accepts the solution(s) at `AgentMessage.solution`
True, after the gatekeeper accepts the solution at `AgentMessage.solution`
"""
def _transform_to_list(value : Any) -> List[Any]:
# type check of items is done next by pydantic
return value if isinstance(value, list) else [value]
class AgentMessage(RiddleInformation):
"""
The basic message, which is sent be the agent and the management.
@ -314,10 +297,9 @@ class AgentMessage(RiddleInformation):
The riddle to solve.
"""
solution: Annotated[List[RiddleSolution], BeforeValidator(_transform_to_list)] = []
solution: RiddleSolution | None = None
"""
The solutions of the riddle (or empty list if no solutions available)
(When assigning a single object of `RiddleSolution` will be convert to list with this single object.)
The solution of the riddle (or empty if no solution available)
"""
data: List[RiddleData] = []
@ -330,13 +312,6 @@ class AgentMessage(RiddleInformation):
The status of the riddle.
"""
contacts : int = 0
"""
A counter representing the number of contacts the management had with this message.
Each time the management processes the message, this counter is incremented by 1.
Using this counter the management is able to detect cycles and stop them.
"""
class AgentResponse(RiddleInformation):
"""
Returned by the management when receiving an `AgentMessage`.

File diff suppressed because one or more lines are too long

View File

@ -46,79 +46,20 @@
<h1 class="modulename">
ums </h1>
<div class="docstring"><p>The package <code><a href="">ums</a></code> contains the Agenten-Plattform, the implementations of the agents shall be created in the package <code>src</code>, see <a href="https://git.chai.uni-hamburg.de/UMS-Agenten/Agent-Template">Agent-Template</a>.</p>
<blockquote>
<p>Side note: The classes with comments may be useful when implementing the agents.
The classes without comments may be safe to ignore and are (only) used internally.</p>
</blockquote>
<ul>
<li><code><a href="ums/agent.html">ums.agent</a></code>
<ul>
<li>Contains the implementation of an agent for handling requests by the implementations in <code>src</code>.</li>
<li>Check for running single tasks without using management.</li>
</ul></li>
<li><code><a href="ums/example.html">ums.example</a></code>
<ul>
<li>Contains a very simple examples for all types of agents.</li>
<li>See <code><a href="ums/example/example.html">ums.example.example</a></code></li>
</ul></li>
<li><code><a href="ums/management.html">ums.management</a></code>
<ul>
<li>Contains the implementation of the management.</li>
<li>Take a look at the web gui of the management, possibly at <a href="http://localhost:8080/"><a href="http://localhost:8080/">http://localhost:8080/</a></a> or <a href="http://localhost:8000/"><a href="http://localhost:8000/">http://localhost:8000/</a></a></li>
</ul></li>
<li><code><a href="ums/utils.html">ums.utils</a></code>
<ul>
<li>Contains various utilities.</li>
<li><code><a href="ums/utils/const.html#SHARE_PATH">ums.utils.const.SHARE_PATH</a></code> The path for shared files between all agents</li>
<li><code><a href="ums/utils/const.html#PERSIST_PATH">ums.utils.const.PERSIST_PATH</a></code> The path to store persistent data of an agent</li>
<li><code><a href="ums/utils/request.html#ManagementRequest">ums.utils.request.ManagementRequest</a></code> Run request to the management (only necessary in special cases, most requests done automatically by platform)</li>
<li><code><a href="ums/utils/schema.html">ums.utils.schema</a></code> The schema (types) used in the files storing extracted data from plain data</li>
<li><code><a href="ums/utils/types.html">ums.utils.types</a></code> The types used in the communication between agent and management</li>
</ul></li>
</ul>
</div>
<input id="mod-ums-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-ums-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1"># Agenten Plattform</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1">#</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1"># (c) 2024 Magnus Bender</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># Institute of Humanities-Centered Artificial Intelligence (CHAI)</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># Universitaet Hamburg</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># https://www.chai.uni-hamburg.de/~bender</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1"># </span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="sd">The package `ums` contains the Agenten-Plattform, the implementations of the agents shall be created in the package `src`, see [Agent-Template](https://git.chai.uni-hamburg.de/UMS-Agenten/Agent-Template).</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="sd">&gt; Side note: The classes with comments may be useful when implementing the agents.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="sd">&gt; The classes without comments may be safe to ignore and are (only) used internally.</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="sd">- `ums.agent`</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="sd"> - Contains the implementation of an agent for handling requests by the implementations in `src`.</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="sd"> - Check for running single tasks without using management.</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="sd">- `ums.example`</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="sd"> - Contains a very simple examples for all types of agents.</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="sd"> - See `ums.example.example`</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="sd">- `ums.management`</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="sd"> - Contains the implementation of the management.</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a><span class="sd"> - Take a look at the web gui of the management, possibly at &lt;http://localhost:8080/&gt; or &lt;http://localhost:8000/&gt;</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="sd">- `ums.utils`</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a><span class="sd"> - Contains various utilities.</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a><span class="sd"> - `ums.utils.const.SHARE_PATH` The path for shared files between all agents</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a><span class="sd"> - `ums.utils.const.PERSIST_PATH` The path to store persistent data of an agent</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a><span class="sd"> - `ums.utils.request.ManagementRequest` Run request to the management (only necessary in special cases, most requests done automatically by platform)</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a><span class="sd"> - `ums.utils.schema` The schema (types) used in the files storing extracted data from plain data</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a><span class="sd"> - `ums.utils.types` The types used in the communication between agent and management</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a><span class="sd">&quot;&quot;&quot;</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos">1</span></a><span class="c1"># Agenten Plattform</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos">2</span></a><span class="c1">#</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos">3</span></a><span class="c1"># (c) 2024 Magnus Bender</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos">4</span></a><span class="c1"># Institute of Humanities-Centered Artificial Intelligence (CHAI)</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos">5</span></a><span class="c1"># Universitaet Hamburg</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos">6</span></a><span class="c1"># https://www.chai.uni-hamburg.de/~bender</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos">7</span></a><span class="c1"># </span>
</span><span id="L-8"><a href="#L-8"><span class="linenos">8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos">9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span></pre></div>

View File

@ -28,12 +28,6 @@
<input type="search" placeholder="Search..." role="searchbox" aria-label="search"
pattern=".+" required>
<h2>Contents</h2>
<ul>
<li><a href="#run-as-agent">Run as Agent</a></li>
<li><a href="#run-single-task">Run Single Task</a></li>
</ul>
<h2>Submodules</h2>
<ul>
@ -56,46 +50,6 @@
<h1 class="modulename">
<a href="./../ums.html">ums</a><wbr>.agent </h1>
<div class="docstring"><h2 id="run-as-agent">Run as Agent</h2>
<p>The env. variable <code>AGENTS_LIST</code> is used to identify the agents classes/ task handlers.
It must contain he the package name and a variable name in this package divided by <code>:</code>.
Then, the variable contains a list of agent classes (subclasses of <code><a href="agent/agent.html#BasicAgent">ums.agent.agent.BasicAgent</a></code>)</p>
<p>For example <code>AGENTS_LIST=ums.example.example:AGENT_CLASSES</code>, then in file <code>./ums/example/example.py</code> a variable <code>AGENT_CLASSES</code> exists.
One line in this file, e.g., is <code>AGENT_CLASSES = [MyExtractAudioAgent, MyExtractImageAgent]</code>.</p>
<p>When starting the Docker container of the agent, the classes specified in <code>AGENTS_LIST</code> are loaded and if the agent receives a task, the task is sent to the agent classes' <code>handle</code> methods.</p>
<h2 id="run-single-task">Run Single Task</h2>
<p>For development it might be cumbersome to always require a running management container and sending messages.
Hence, tasks can be run manually from the terminal (still in the container and using the agent classes), but without having a management.</p>
<p>This also uses the <code>AGENTS_LIST</code> env. variable, but the tasks are sent via command line:</p>
<p>There are three ways to send a task (if the agent's Docker container is running):</p>
<ul>
<li><code>docker compose exec agent_all python -m <a href="">ums.agent</a> -d</code>
<ul>
<li>Run a dummy task</li>
<li>Possibly <code>agent_all</code> needs to be changed to the service name (see <code>docker-compose.yml</code>) of the agent's Docker container</li>
</ul></li>
<li><code>cat ./msg.json | docker compose exec -T agent_all python -m <a href="">ums.agent</a> -i</code>
<ul>
<li>Send the task (json of <code>AgentMessage</code>) via STDIN from file <code>./msg.json</code> to the agent</li>
</ul></li>
<li><code>docker compose exec agent_all python -m <a href="">ums.agent</a> -f msg.json</code>
<ul>
<li>Get the task from the json file, the files are searched for by full name, in the shared, and the persistent directory.</li>
</ul></li>
</ul>
<p>If the Agent's Docker container is not running, a temporary container can be started.
For the dummy message, the command would be <code>docker compose run --rm --entrypoint "" agent_all python -m <a href="">ums.agent</a> -d</code>.
(Again, change <code>agent_all</code> for the service name in <code>docker-compose.yml</code>.)</p>
</div>
<input id="mod-agent-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
@ -111,49 +65,14 @@ For the dummy message, the command would be <code>docker compose run --rm --entr
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="sd">## Run as Agent</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="sd">The env. variable `AGENTS_LIST` is used to identify the agents classes/ task handlers.</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="sd">It must contain he the package name and a variable name in this package divided by `:`. </span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="sd">Then, the variable contains a list of agent classes (subclasses of `ums.agent.agent.BasicAgent`)</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="sd">For example `AGENTS_LIST=ums.example.example:AGENT_CLASSES`, then in file `./ums/example/example.py` a variable `AGENT_CLASSES` exists. </span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="sd">One line in this file, e.g., is `AGENT_CLASSES = [MyExtractAudioAgent, MyExtractImageAgent]`.</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="sd">When starting the Docker container of the agent, the classes specified in `AGENTS_LIST` are loaded and if the agent receives a task, the task is sent to the agent classes&#39; `handle` methods.</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="sd">## Run Single Task</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="sd">For development it might be cumbersome to always require a running management container and sending messages. </span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a><span class="sd">Hence, tasks can be run manually from the terminal (still in the container and using the agent classes), but without having a management.</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a><span class="sd">This also uses the `AGENTS_LIST` env. variable, but the tasks are sent via command line:</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a><span class="sd">There are three ways to send a task (if the agent&#39;s Docker container is running):</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a><span class="sd">- `docker compose exec agent_all python -m ums.agent -d`</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a><span class="sd"> - Run a dummy task</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a><span class="sd"> - Possibly `agent_all` needs to be changed to the service name (see `docker-compose.yml`) of the agent&#39;s Docker container</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a><span class="sd">- `cat ./msg.json | docker compose exec -T agent_all python -m ums.agent -i`</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a><span class="sd"> - Send the task (json of `AgentMessage`) via STDIN from file `./msg.json` to the agent</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a><span class="sd">- `docker compose exec agent_all python -m ums.agent -f msg.json`</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a><span class="sd"> - Get the task from the json file, the files are searched for by full name, in the shared, and the persistent directory.</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a><span class="sd">If the Agent&#39;s Docker container is not running, a temporary container can be started.</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a><span class="sd">For the dummy message, the command would be `docker compose run --rm --entrypoint &quot;&quot; agent_all python -m ums.agent -d`.</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a><span class="sd">(Again, change `agent_all` for the service name in `docker-compose.yml`.)</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a><span class="kn">from</span> <span class="nn">ums.agent.agent</span> <span class="kn">import</span> <span class="p">(</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="n">AgentCapability</span><span class="p">,</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="n">BasicAgent</span><span class="p">,</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="n">ExtractAgent</span><span class="p">,</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a> <span class="n">ExtractAudioAgent</span><span class="p">,</span> <span class="n">ExtractImageAgent</span><span class="p">,</span> <span class="n">ExtractTextAgent</span><span class="p">,</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a> <span class="n">SolveAgent</span><span class="p">,</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a> <span class="n">GatekeeperAgent</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a><span class="p">)</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">from</span> <span class="nn">ums.agent.agent</span> <span class="kn">import</span> <span class="p">(</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a> <span class="n">AgentCapability</span><span class="p">,</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a> <span class="n">BasicAgent</span><span class="p">,</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a> <span class="n">ExtractAgent</span><span class="p">,</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a> <span class="n">ExtractAudioAgent</span><span class="p">,</span> <span class="n">ExtractImageAgent</span><span class="p">,</span> <span class="n">ExtractTextAgent</span><span class="p">,</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a> <span class="n">SolveAgent</span><span class="p">,</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a> <span class="n">GatekeeperAgent</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="p">)</span>
</span></pre></div>

File diff suppressed because it is too large Load Diff

View File

@ -124,7 +124,7 @@
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a> <span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span><span class="o">.</span><span class="n">new_message</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">)</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;ums.agent.main&quot;</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SERVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span><span class="p">:</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;ums.agent.main&quot;</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SERVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span><span class="p">:</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a> <span class="n">main</span> <span class="o">=</span> <span class="n">WebMain</span><span class="p">()</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a> <span class="n">app</span> <span class="o">=</span> <span class="n">main</span><span class="o">.</span><span class="n">app</span>
</span></pre></div>

View File

@ -35,9 +35,6 @@
<li>
<a class="class" href="#MessageProcessor">MessageProcessor</a>
<ul class="memberlist">
<li>
<a class="function" href="#MessageProcessor.__init__">MessageProcessor</a>
</li>
<li>
<a class="variable" href="#MessageProcessor.MANAGEMENT_URL">MANAGEMENT_URL</a>
</li>
@ -47,9 +44,6 @@
<li>
<a class="variable" href="#MessageProcessor.counts">counts</a>
</li>
<li>
<a class="variable" href="#MessageProcessor.disable_messages">disable_messages</a>
</li>
<li>
<a class="variable" href="#MessageProcessor.agent_classes">agent_classes</a>
</li>
@ -89,106 +83,101 @@
<label class="view-source-button" for="mod-process-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1"># Agenten Plattform</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1">#</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1"># (c) 2024 Magnus Bender</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># Institute of Humanities-Centered Artificial Intelligence (CHAI)</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># Universitaet Hamburg</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># https://www.chai.uni-hamburg.de/~bender</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1"># </span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">importlib</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="kn">import</span> <span class="nn">requests</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">BackgroundTasks</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">ums.agent.agent</span> <span class="kn">import</span> <span class="n">BasicAgent</span><span class="p">,</span> <span class="n">AgentCapability</span><span class="p">,</span> <span class="n">ExtractAgent</span><span class="p">,</span> <span class="n">SolveAgent</span><span class="p">,</span> <span class="n">GatekeeperAgent</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="kn">from</span> <span class="nn">ums.utils</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">logger</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="k">class</span> <span class="nc">MessageProcessor</span><span class="p">():</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a> <span class="n">AGENTS_LIST</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_LIST&#39;</span><span class="p">,</span> <span class="s1">&#39;ums.example.example:AGENT_CLASSES&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">disable_messages</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">disable_messages</span> <span class="o">=</span> <span class="n">disable_messages</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">module_name</span><span class="p">,</span> <span class="n">var_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_LIST</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="n">agents_module</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">BasicAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">agents_module</span><span class="p">,</span> <span class="n">var_name</span><span class="p">)</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">ExtractAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">EXTRACT</span><span class="p">,</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="p">))</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">SolveAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">SOLVE</span><span class="p">,</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="p">))</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">GatekeeperAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">GATEKEEPER</span><span class="p">,</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="p">))</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="c1"># send to extract agents</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="n">data_types</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="p">)</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="k">for</span> <span class="n">ac</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="k">if</span> <span class="n">ac</span><span class="o">.</span><span class="n">extract_type</span><span class="p">()</span> <span class="ow">in</span> <span class="n">data_types</span><span class="p">:</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ac</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">for</span> <span class="n">sa</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">sa</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="k">for</span> <span class="n">ga</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ga</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="p">(</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span><span class="p">)</span> <span class="o">+</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="sa">f</span><span class="s2">&quot;ID: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> Count: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">count</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="n">error</span><span class="o">=</span><span class="ow">not</span> <span class="n">enqueued</span><span class="p">,</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="kc">None</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="p">)</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">disable_messages</span><span class="p">:</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">),</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="p">)</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to management! </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\t</span><span class="s2">Messages disabled: Requested to send message to management:&quot;</span><span class="p">)</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(</span><span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">))</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1"># Agenten Plattform</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1">#</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1"># (c) 2024 Magnus Bender</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># Institute of Humanities-Centered Artificial Intelligence (CHAI)</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># Universitaet Hamburg</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># https://www.chai.uni-hamburg.de/~bender</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1"># </span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">importlib</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="kn">import</span> <span class="nn">requests</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">BackgroundTasks</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">ums.agent.agent</span> <span class="kn">import</span> <span class="n">BasicAgent</span><span class="p">,</span> <span class="n">AgentCapability</span><span class="p">,</span> <span class="n">ExtractAgent</span><span class="p">,</span> <span class="n">SolveAgent</span><span class="p">,</span> <span class="n">GatekeeperAgent</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="kn">from</span> <span class="nn">ums.utils</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">logger</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="k">class</span> <span class="nc">MessageProcessor</span><span class="p">():</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a> <span class="n">AGENTS_LIST</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_LIST&#39;</span><span class="p">,</span> <span class="s1">&#39;ums.example.example:AGENT_CLASSES&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="n">module_name</span><span class="p">,</span> <span class="n">var_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_LIST</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="n">agents_module</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">BasicAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">agents_module</span><span class="p">,</span> <span class="n">var_name</span><span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">ExtractAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">EXTRACT</span><span class="p">,</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="p">))</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">SolveAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">SOLVE</span><span class="p">,</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="p">))</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">GatekeeperAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">GATEKEEPER</span><span class="p">,</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="p">))</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="c1"># send to extract agents</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a> <span class="n">data_types</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="p">)</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a> <span class="k">for</span> <span class="n">ac</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a> <span class="k">if</span> <span class="n">ac</span><span class="o">.</span><span class="n">extract_type</span><span class="p">()</span> <span class="ow">in</span> <span class="n">data_types</span><span class="p">:</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ac</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a>
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a> <span class="k">for</span> <span class="n">sa</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">sa</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a> <span class="k">for</span> <span class="n">ga</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ga</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a>
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a> <span class="p">(</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span><span class="p">)</span> <span class="o">+</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a> <span class="sa">f</span><span class="s2">&quot;ID: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> Count: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a> <span class="p">)</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos">75</span></a>
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos">77</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a> <span class="n">count</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos">80</span></a> <span class="n">error</span><span class="o">=</span><span class="ow">not</span> <span class="n">enqueued</span><span class="p">,</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos">81</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="kc">None</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos">82</span></a> <span class="p">)</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos">83</span></a>
</span><span id="L-84"><a href="#L-84"><span class="linenos">84</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos">85</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos">86</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">),</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos">87</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos">88</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos">89</span></a> <span class="p">)</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos">90</span></a>
</span><span id="L-91"><a href="#L-91"><span class="linenos">91</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos">92</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos">93</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos">94</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to management! </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="kc">False</span>
</span></pre></div>
@ -204,128 +193,87 @@
</div>
<a class="headerlink" href="#MessageProcessor"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor-21"><a href="#MessageProcessor-21"><span class="linenos"> 21</span></a><span class="k">class</span> <span class="nc">MessageProcessor</span><span class="p">():</span>
</span><span id="MessageProcessor-22"><a href="#MessageProcessor-22"><span class="linenos"> 22</span></a>
</span><span id="MessageProcessor-23"><a href="#MessageProcessor-23"><span class="linenos"> 23</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-24"><a href="#MessageProcessor-24"><span class="linenos"> 24</span></a> <span class="n">AGENTS_LIST</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_LIST&#39;</span><span class="p">,</span> <span class="s1">&#39;ums.example.example:AGENT_CLASSES&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span><span id="MessageProcessor-25"><a href="#MessageProcessor-25"><span class="linenos"> 25</span></a>
</span><span id="MessageProcessor-26"><a href="#MessageProcessor-26"><span class="linenos"> 26</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">disable_messages</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="MessageProcessor-27"><a href="#MessageProcessor-27"><span class="linenos"> 27</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="MessageProcessor-28"><a href="#MessageProcessor-28"><span class="linenos"> 28</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">disable_messages</span> <span class="o">=</span> <span class="n">disable_messages</span>
</span><span id="MessageProcessor-29"><a href="#MessageProcessor-29"><span class="linenos"> 29</span></a>
</span><span id="MessageProcessor-30"><a href="#MessageProcessor-30"><span class="linenos"> 30</span></a> <span class="n">module_name</span><span class="p">,</span> <span class="n">var_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_LIST</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-31"><a href="#MessageProcessor-31"><span class="linenos"> 31</span></a> <span class="n">agents_module</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
</span><span id="MessageProcessor-32"><a href="#MessageProcessor-32"><span class="linenos"> 32</span></a>
</span><span id="MessageProcessor-33"><a href="#MessageProcessor-33"><span class="linenos"> 33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">BasicAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">agents_module</span><span class="p">,</span> <span class="n">var_name</span><span class="p">)</span>
</span><span id="MessageProcessor-34"><a href="#MessageProcessor-34"><span class="linenos"> 34</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">ExtractAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor-35"><a href="#MessageProcessor-35"><span class="linenos"> 35</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">EXTRACT</span><span class="p">,</span>
</span><span id="MessageProcessor-36"><a href="#MessageProcessor-36"><span class="linenos"> 36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor-37"><a href="#MessageProcessor-37"><span class="linenos"> 37</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-38"><a href="#MessageProcessor-38"><span class="linenos"> 38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">SolveAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor-39"><a href="#MessageProcessor-39"><span class="linenos"> 39</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">SOLVE</span><span class="p">,</span>
</span><span id="MessageProcessor-40"><a href="#MessageProcessor-40"><span class="linenos"> 40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor-41"><a href="#MessageProcessor-41"><span class="linenos"> 41</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-42"><a href="#MessageProcessor-42"><span class="linenos"> 42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">GatekeeperAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor-43"><a href="#MessageProcessor-43"><span class="linenos"> 43</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">GATEKEEPER</span><span class="p">,</span>
</span><span id="MessageProcessor-44"><a href="#MessageProcessor-44"><span class="linenos"> 44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor-45"><a href="#MessageProcessor-45"><span class="linenos"> 45</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-46"><a href="#MessageProcessor-46"><span class="linenos"> 46</span></a>
</span><span id="MessageProcessor-47"><a href="#MessageProcessor-47"><span class="linenos"> 47</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="MessageProcessor-48"><a href="#MessageProcessor-48"><span class="linenos"> 48</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-49"><a href="#MessageProcessor-49"><span class="linenos"> 49</span></a>
</span><span id="MessageProcessor-50"><a href="#MessageProcessor-50"><span class="linenos"> 50</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-51"><a href="#MessageProcessor-51"><span class="linenos"> 51</span></a> <span class="c1"># send to extract agents</span>
</span><span id="MessageProcessor-52"><a href="#MessageProcessor-52"><span class="linenos"> 52</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-53"><a href="#MessageProcessor-53"><span class="linenos"> 53</span></a> <span class="n">data_types</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="p">)</span>
</span><span id="MessageProcessor-54"><a href="#MessageProcessor-54"><span class="linenos"> 54</span></a> <span class="k">for</span> <span class="n">ac</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span>
</span><span id="MessageProcessor-55"><a href="#MessageProcessor-55"><span class="linenos"> 55</span></a> <span class="k">if</span> <span class="n">ac</span><span class="o">.</span><span class="n">extract_type</span><span class="p">()</span> <span class="ow">in</span> <span class="n">data_types</span><span class="p">:</span>
</span><span id="MessageProcessor-56"><a href="#MessageProcessor-56"><span class="linenos"> 56</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ac</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor-57"><a href="#MessageProcessor-57"><span class="linenos"> 57</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-58"><a href="#MessageProcessor-58"><span class="linenos"> 58</span></a>
</span><span id="MessageProcessor-59"><a href="#MessageProcessor-59"><span class="linenos"> 59</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-60"><a href="#MessageProcessor-60"><span class="linenos"> 60</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-61"><a href="#MessageProcessor-61"><span class="linenos"> 61</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-62"><a href="#MessageProcessor-62"><span class="linenos"> 62</span></a> <span class="k">for</span> <span class="n">sa</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span>
</span><span id="MessageProcessor-63"><a href="#MessageProcessor-63"><span class="linenos"> 63</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">sa</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor-64"><a href="#MessageProcessor-64"><span class="linenos"> 64</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-65"><a href="#MessageProcessor-65"><span class="linenos"> 65</span></a>
</span><span id="MessageProcessor-66"><a href="#MessageProcessor-66"><span class="linenos"> 66</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-67"><a href="#MessageProcessor-67"><span class="linenos"> 67</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-68"><a href="#MessageProcessor-68"><span class="linenos"> 68</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-69"><a href="#MessageProcessor-69"><span class="linenos"> 69</span></a> <span class="k">for</span> <span class="n">ga</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span>
</span><span id="MessageProcessor-70"><a href="#MessageProcessor-70"><span class="linenos"> 70</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ga</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor-71"><a href="#MessageProcessor-71"><span class="linenos"> 71</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-72"><a href="#MessageProcessor-72"><span class="linenos"> 72</span></a>
</span><span id="MessageProcessor-73"><a href="#MessageProcessor-73"><span class="linenos"> 73</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="MessageProcessor-74"><a href="#MessageProcessor-74"><span class="linenos"> 74</span></a> <span class="p">(</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span><span class="p">)</span> <span class="o">+</span>
</span><span id="MessageProcessor-75"><a href="#MessageProcessor-75"><span class="linenos"> 75</span></a> <span class="sa">f</span><span class="s2">&quot;ID: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> Count: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="MessageProcessor-76"><a href="#MessageProcessor-76"><span class="linenos"> 76</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-77"><a href="#MessageProcessor-77"><span class="linenos"> 77</span></a>
</span><span id="MessageProcessor-78"><a href="#MessageProcessor-78"><span class="linenos"> 78</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="MessageProcessor-79"><a href="#MessageProcessor-79"><span class="linenos"> 79</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor-80"><a href="#MessageProcessor-80"><span class="linenos"> 80</span></a> <span class="n">count</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor-81"><a href="#MessageProcessor-81"><span class="linenos"> 81</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="MessageProcessor-82"><a href="#MessageProcessor-82"><span class="linenos"> 82</span></a> <span class="n">error</span><span class="o">=</span><span class="ow">not</span> <span class="n">enqueued</span><span class="p">,</span>
</span><span id="MessageProcessor-83"><a href="#MessageProcessor-83"><span class="linenos"> 83</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="kc">None</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span>
</span><span id="MessageProcessor-84"><a href="#MessageProcessor-84"><span class="linenos"> 84</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-85"><a href="#MessageProcessor-85"><span class="linenos"> 85</span></a>
</span><span id="MessageProcessor-86"><a href="#MessageProcessor-86"><span class="linenos"> 86</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-87"><a href="#MessageProcessor-87"><span class="linenos"> 87</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">disable_messages</span><span class="p">:</span>
</span><span id="MessageProcessor-88"><a href="#MessageProcessor-88"><span class="linenos"> 88</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="MessageProcessor-89"><a href="#MessageProcessor-89"><span class="linenos"> 89</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">),</span>
</span><span id="MessageProcessor-90"><a href="#MessageProcessor-90"><span class="linenos"> 90</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="MessageProcessor-91"><a href="#MessageProcessor-91"><span class="linenos"> 91</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="MessageProcessor-92"><a href="#MessageProcessor-92"><span class="linenos"> 92</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-93"><a href="#MessageProcessor-93"><span class="linenos"> 93</span></a>
</span><span id="MessageProcessor-94"><a href="#MessageProcessor-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="MessageProcessor-95"><a href="#MessageProcessor-95"><span class="linenos"> 95</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MessageProcessor-96"><a href="#MessageProcessor-96"><span class="linenos"> 96</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-97"><a href="#MessageProcessor-97"><span class="linenos"> 97</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to management! </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-98"><a href="#MessageProcessor-98"><span class="linenos"> 98</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="MessageProcessor-99"><a href="#MessageProcessor-99"><span class="linenos"> 99</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-100"><a href="#MessageProcessor-100"><span class="linenos">100</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\t</span><span class="s2">Messages disabled: Requested to send message to management:&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-101"><a href="#MessageProcessor-101"><span class="linenos">101</span></a> <span class="nb">print</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(</span><span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">))</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor-21"><a href="#MessageProcessor-21"><span class="linenos">21</span></a><span class="k">class</span> <span class="nc">MessageProcessor</span><span class="p">():</span>
</span><span id="MessageProcessor-22"><a href="#MessageProcessor-22"><span class="linenos">22</span></a>
</span><span id="MessageProcessor-23"><a href="#MessageProcessor-23"><span class="linenos">23</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-24"><a href="#MessageProcessor-24"><span class="linenos">24</span></a> <span class="n">AGENTS_LIST</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_LIST&#39;</span><span class="p">,</span> <span class="s1">&#39;ums.example.example:AGENT_CLASSES&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span><span id="MessageProcessor-25"><a href="#MessageProcessor-25"><span class="linenos">25</span></a>
</span><span id="MessageProcessor-26"><a href="#MessageProcessor-26"><span class="linenos">26</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="MessageProcessor-27"><a href="#MessageProcessor-27"><span class="linenos">27</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="MessageProcessor-28"><a href="#MessageProcessor-28"><span class="linenos">28</span></a>
</span><span id="MessageProcessor-29"><a href="#MessageProcessor-29"><span class="linenos">29</span></a> <span class="n">module_name</span><span class="p">,</span> <span class="n">var_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_LIST</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-30"><a href="#MessageProcessor-30"><span class="linenos">30</span></a> <span class="n">agents_module</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
</span><span id="MessageProcessor-31"><a href="#MessageProcessor-31"><span class="linenos">31</span></a>
</span><span id="MessageProcessor-32"><a href="#MessageProcessor-32"><span class="linenos">32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">BasicAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">agents_module</span><span class="p">,</span> <span class="n">var_name</span><span class="p">)</span>
</span><span id="MessageProcessor-33"><a href="#MessageProcessor-33"><span class="linenos">33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">ExtractAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor-34"><a href="#MessageProcessor-34"><span class="linenos">34</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">EXTRACT</span><span class="p">,</span>
</span><span id="MessageProcessor-35"><a href="#MessageProcessor-35"><span class="linenos">35</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor-36"><a href="#MessageProcessor-36"><span class="linenos">36</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-37"><a href="#MessageProcessor-37"><span class="linenos">37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">SolveAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor-38"><a href="#MessageProcessor-38"><span class="linenos">38</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">SOLVE</span><span class="p">,</span>
</span><span id="MessageProcessor-39"><a href="#MessageProcessor-39"><span class="linenos">39</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor-40"><a href="#MessageProcessor-40"><span class="linenos">40</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-41"><a href="#MessageProcessor-41"><span class="linenos">41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">GatekeeperAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor-42"><a href="#MessageProcessor-42"><span class="linenos">42</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">GATEKEEPER</span><span class="p">,</span>
</span><span id="MessageProcessor-43"><a href="#MessageProcessor-43"><span class="linenos">43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor-44"><a href="#MessageProcessor-44"><span class="linenos">44</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-45"><a href="#MessageProcessor-45"><span class="linenos">45</span></a>
</span><span id="MessageProcessor-46"><a href="#MessageProcessor-46"><span class="linenos">46</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="MessageProcessor-47"><a href="#MessageProcessor-47"><span class="linenos">47</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-48"><a href="#MessageProcessor-48"><span class="linenos">48</span></a>
</span><span id="MessageProcessor-49"><a href="#MessageProcessor-49"><span class="linenos">49</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-50"><a href="#MessageProcessor-50"><span class="linenos">50</span></a> <span class="c1"># send to extract agents</span>
</span><span id="MessageProcessor-51"><a href="#MessageProcessor-51"><span class="linenos">51</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-52"><a href="#MessageProcessor-52"><span class="linenos">52</span></a> <span class="n">data_types</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="p">)</span>
</span><span id="MessageProcessor-53"><a href="#MessageProcessor-53"><span class="linenos">53</span></a> <span class="k">for</span> <span class="n">ac</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span>
</span><span id="MessageProcessor-54"><a href="#MessageProcessor-54"><span class="linenos">54</span></a> <span class="k">if</span> <span class="n">ac</span><span class="o">.</span><span class="n">extract_type</span><span class="p">()</span> <span class="ow">in</span> <span class="n">data_types</span><span class="p">:</span>
</span><span id="MessageProcessor-55"><a href="#MessageProcessor-55"><span class="linenos">55</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ac</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor-56"><a href="#MessageProcessor-56"><span class="linenos">56</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-57"><a href="#MessageProcessor-57"><span class="linenos">57</span></a>
</span><span id="MessageProcessor-58"><a href="#MessageProcessor-58"><span class="linenos">58</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-59"><a href="#MessageProcessor-59"><span class="linenos">59</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-60"><a href="#MessageProcessor-60"><span class="linenos">60</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-61"><a href="#MessageProcessor-61"><span class="linenos">61</span></a> <span class="k">for</span> <span class="n">sa</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span>
</span><span id="MessageProcessor-62"><a href="#MessageProcessor-62"><span class="linenos">62</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">sa</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor-63"><a href="#MessageProcessor-63"><span class="linenos">63</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-64"><a href="#MessageProcessor-64"><span class="linenos">64</span></a>
</span><span id="MessageProcessor-65"><a href="#MessageProcessor-65"><span class="linenos">65</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-66"><a href="#MessageProcessor-66"><span class="linenos">66</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-67"><a href="#MessageProcessor-67"><span class="linenos">67</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-68"><a href="#MessageProcessor-68"><span class="linenos">68</span></a> <span class="k">for</span> <span class="n">ga</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span>
</span><span id="MessageProcessor-69"><a href="#MessageProcessor-69"><span class="linenos">69</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ga</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor-70"><a href="#MessageProcessor-70"><span class="linenos">70</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-71"><a href="#MessageProcessor-71"><span class="linenos">71</span></a>
</span><span id="MessageProcessor-72"><a href="#MessageProcessor-72"><span class="linenos">72</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="MessageProcessor-73"><a href="#MessageProcessor-73"><span class="linenos">73</span></a> <span class="p">(</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span><span class="p">)</span> <span class="o">+</span>
</span><span id="MessageProcessor-74"><a href="#MessageProcessor-74"><span class="linenos">74</span></a> <span class="sa">f</span><span class="s2">&quot;ID: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> Count: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="MessageProcessor-75"><a href="#MessageProcessor-75"><span class="linenos">75</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-76"><a href="#MessageProcessor-76"><span class="linenos">76</span></a>
</span><span id="MessageProcessor-77"><a href="#MessageProcessor-77"><span class="linenos">77</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="MessageProcessor-78"><a href="#MessageProcessor-78"><span class="linenos">78</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor-79"><a href="#MessageProcessor-79"><span class="linenos">79</span></a> <span class="n">count</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor-80"><a href="#MessageProcessor-80"><span class="linenos">80</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="MessageProcessor-81"><a href="#MessageProcessor-81"><span class="linenos">81</span></a> <span class="n">error</span><span class="o">=</span><span class="ow">not</span> <span class="n">enqueued</span><span class="p">,</span>
</span><span id="MessageProcessor-82"><a href="#MessageProcessor-82"><span class="linenos">82</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="kc">None</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span>
</span><span id="MessageProcessor-83"><a href="#MessageProcessor-83"><span class="linenos">83</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-84"><a href="#MessageProcessor-84"><span class="linenos">84</span></a>
</span><span id="MessageProcessor-85"><a href="#MessageProcessor-85"><span class="linenos">85</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-86"><a href="#MessageProcessor-86"><span class="linenos">86</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="MessageProcessor-87"><a href="#MessageProcessor-87"><span class="linenos">87</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">),</span>
</span><span id="MessageProcessor-88"><a href="#MessageProcessor-88"><span class="linenos">88</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="MessageProcessor-89"><a href="#MessageProcessor-89"><span class="linenos">89</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="MessageProcessor-90"><a href="#MessageProcessor-90"><span class="linenos">90</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-91"><a href="#MessageProcessor-91"><span class="linenos">91</span></a>
</span><span id="MessageProcessor-92"><a href="#MessageProcessor-92"><span class="linenos">92</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="MessageProcessor-93"><a href="#MessageProcessor-93"><span class="linenos">93</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MessageProcessor-94"><a href="#MessageProcessor-94"><span class="linenos">94</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-95"><a href="#MessageProcessor-95"><span class="linenos">95</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to management! </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-96"><a href="#MessageProcessor-96"><span class="linenos">96</span></a> <span class="k">return</span> <span class="kc">False</span>
</span></pre></div>
<div id="MessageProcessor.__init__" class="classattr">
<input id="MessageProcessor.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">MessageProcessor</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">disable_messages</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span>)</span>
<label class="view-source-button" for="MessageProcessor.__init__-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#MessageProcessor.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor.__init__-26"><a href="#MessageProcessor.__init__-26"><span class="linenos">26</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">disable_messages</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="MessageProcessor.__init__-27"><a href="#MessageProcessor.__init__-27"><span class="linenos">27</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="MessageProcessor.__init__-28"><a href="#MessageProcessor.__init__-28"><span class="linenos">28</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">disable_messages</span> <span class="o">=</span> <span class="n">disable_messages</span>
</span><span id="MessageProcessor.__init__-29"><a href="#MessageProcessor.__init__-29"><span class="linenos">29</span></a>
</span><span id="MessageProcessor.__init__-30"><a href="#MessageProcessor.__init__-30"><span class="linenos">30</span></a> <span class="n">module_name</span><span class="p">,</span> <span class="n">var_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_LIST</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-31"><a href="#MessageProcessor.__init__-31"><span class="linenos">31</span></a> <span class="n">agents_module</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-32"><a href="#MessageProcessor.__init__-32"><span class="linenos">32</span></a>
</span><span id="MessageProcessor.__init__-33"><a href="#MessageProcessor.__init__-33"><span class="linenos">33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">BasicAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">agents_module</span><span class="p">,</span> <span class="n">var_name</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-34"><a href="#MessageProcessor.__init__-34"><span class="linenos">34</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">ExtractAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor.__init__-35"><a href="#MessageProcessor.__init__-35"><span class="linenos">35</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">EXTRACT</span><span class="p">,</span>
</span><span id="MessageProcessor.__init__-36"><a href="#MessageProcessor.__init__-36"><span class="linenos">36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor.__init__-37"><a href="#MessageProcessor.__init__-37"><span class="linenos">37</span></a> <span class="p">))</span>
</span><span id="MessageProcessor.__init__-38"><a href="#MessageProcessor.__init__-38"><span class="linenos">38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">SolveAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor.__init__-39"><a href="#MessageProcessor.__init__-39"><span class="linenos">39</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">SOLVE</span><span class="p">,</span>
</span><span id="MessageProcessor.__init__-40"><a href="#MessageProcessor.__init__-40"><span class="linenos">40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor.__init__-41"><a href="#MessageProcessor.__init__-41"><span class="linenos">41</span></a> <span class="p">))</span>
</span><span id="MessageProcessor.__init__-42"><a href="#MessageProcessor.__init__-42"><span class="linenos">42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">GatekeeperAgent</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span>
</span><span id="MessageProcessor.__init__-43"><a href="#MessageProcessor.__init__-43"><span class="linenos">43</span></a> <span class="k">lambda</span> <span class="n">ac</span><span class="p">:</span> <span class="n">ac</span><span class="o">.</span><span class="n">agent_capability</span><span class="p">()</span> <span class="o">==</span> <span class="n">AgentCapability</span><span class="o">.</span><span class="n">GATEKEEPER</span><span class="p">,</span>
</span><span id="MessageProcessor.__init__-44"><a href="#MessageProcessor.__init__-44"><span class="linenos">44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">agent_classes</span>
</span><span id="MessageProcessor.__init__-45"><a href="#MessageProcessor.__init__-45"><span class="linenos">45</span></a> <span class="p">))</span>
</span></pre></div>
</div>
<div id="MessageProcessor.MANAGEMENT_URL" class="classattr">
<div class="attr variable">
<span class="name">MANAGEMENT_URL</span> =
@ -360,17 +308,6 @@
</div>
<div id="MessageProcessor.disable_messages" class="classattr">
<div class="attr variable">
<span class="name">disable_messages</span>
</div>
<a class="headerlink" href="#MessageProcessor.disable_messages"></a>
</div>
<div id="MessageProcessor.agent_classes" class="classattr">
<div class="attr variable">
@ -427,44 +364,44 @@
</div>
<a class="headerlink" href="#MessageProcessor.new_message"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor.new_message-47"><a href="#MessageProcessor.new_message-47"><span class="linenos">47</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-48"><a href="#MessageProcessor.new_message-48"><span class="linenos">48</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor.new_message-49"><a href="#MessageProcessor.new_message-49"><span class="linenos">49</span></a>
</span><span id="MessageProcessor.new_message-50"><a href="#MessageProcessor.new_message-50"><span class="linenos">50</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-51"><a href="#MessageProcessor.new_message-51"><span class="linenos">51</span></a> <span class="c1"># send to extract agents</span>
</span><span id="MessageProcessor.new_message-52"><a href="#MessageProcessor.new_message-52"><span class="linenos">52</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-53"><a href="#MessageProcessor.new_message-53"><span class="linenos">53</span></a> <span class="n">data_types</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="p">)</span>
</span><span id="MessageProcessor.new_message-54"><a href="#MessageProcessor.new_message-54"><span class="linenos">54</span></a> <span class="k">for</span> <span class="n">ac</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-55"><a href="#MessageProcessor.new_message-55"><span class="linenos">55</span></a> <span class="k">if</span> <span class="n">ac</span><span class="o">.</span><span class="n">extract_type</span><span class="p">()</span> <span class="ow">in</span> <span class="n">data_types</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-56"><a href="#MessageProcessor.new_message-56"><span class="linenos">56</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ac</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-57"><a href="#MessageProcessor.new_message-57"><span class="linenos">57</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor.new_message-58"><a href="#MessageProcessor.new_message-58"><span class="linenos">58</span></a>
</span><span id="MessageProcessor.new_message-59"><a href="#MessageProcessor.new_message-59"><span class="linenos">59</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-60"><a href="#MessageProcessor.new_message-60"><span class="linenos">60</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor.new_message-61"><a href="#MessageProcessor.new_message-61"><span class="linenos">61</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-62"><a href="#MessageProcessor.new_message-62"><span class="linenos">62</span></a> <span class="k">for</span> <span class="n">sa</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-63"><a href="#MessageProcessor.new_message-63"><span class="linenos">63</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">sa</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-64"><a href="#MessageProcessor.new_message-64"><span class="linenos">64</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor.new_message-65"><a href="#MessageProcessor.new_message-65"><span class="linenos">65</span></a>
</span><span id="MessageProcessor.new_message-66"><a href="#MessageProcessor.new_message-66"><span class="linenos">66</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-67"><a href="#MessageProcessor.new_message-67"><span class="linenos">67</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor.new_message-68"><a href="#MessageProcessor.new_message-68"><span class="linenos">68</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-69"><a href="#MessageProcessor.new_message-69"><span class="linenos">69</span></a> <span class="k">for</span> <span class="n">ga</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-70"><a href="#MessageProcessor.new_message-70"><span class="linenos">70</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ga</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-71"><a href="#MessageProcessor.new_message-71"><span class="linenos">71</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor.new_message-72"><a href="#MessageProcessor.new_message-72"><span class="linenos">72</span></a>
</span><span id="MessageProcessor.new_message-73"><a href="#MessageProcessor.new_message-73"><span class="linenos">73</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-74"><a href="#MessageProcessor.new_message-74"><span class="linenos">74</span></a> <span class="p">(</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span><span class="p">)</span> <span class="o">+</span>
</span><span id="MessageProcessor.new_message-75"><a href="#MessageProcessor.new_message-75"><span class="linenos">75</span></a> <span class="sa">f</span><span class="s2">&quot;ID: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> Count: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="MessageProcessor.new_message-76"><a href="#MessageProcessor.new_message-76"><span class="linenos">76</span></a> <span class="p">)</span>
</span><span id="MessageProcessor.new_message-77"><a href="#MessageProcessor.new_message-77"><span class="linenos">77</span></a>
</span><span id="MessageProcessor.new_message-78"><a href="#MessageProcessor.new_message-78"><span class="linenos">78</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="MessageProcessor.new_message-79"><a href="#MessageProcessor.new_message-79"><span class="linenos">79</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-80"><a href="#MessageProcessor.new_message-80"><span class="linenos">80</span></a> <span class="n">count</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-81"><a href="#MessageProcessor.new_message-81"><span class="linenos">81</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-82"><a href="#MessageProcessor.new_message-82"><span class="linenos">82</span></a> <span class="n">error</span><span class="o">=</span><span class="ow">not</span> <span class="n">enqueued</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-83"><a href="#MessageProcessor.new_message-83"><span class="linenos">83</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="kc">None</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span>
</span><span id="MessageProcessor.new_message-84"><a href="#MessageProcessor.new_message-84"><span class="linenos">84</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor.new_message-46"><a href="#MessageProcessor.new_message-46"><span class="linenos">46</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-47"><a href="#MessageProcessor.new_message-47"><span class="linenos">47</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor.new_message-48"><a href="#MessageProcessor.new_message-48"><span class="linenos">48</span></a>
</span><span id="MessageProcessor.new_message-49"><a href="#MessageProcessor.new_message-49"><span class="linenos">49</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-50"><a href="#MessageProcessor.new_message-50"><span class="linenos">50</span></a> <span class="c1"># send to extract agents</span>
</span><span id="MessageProcessor.new_message-51"><a href="#MessageProcessor.new_message-51"><span class="linenos">51</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-52"><a href="#MessageProcessor.new_message-52"><span class="linenos">52</span></a> <span class="n">data_types</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="p">)</span>
</span><span id="MessageProcessor.new_message-53"><a href="#MessageProcessor.new_message-53"><span class="linenos">53</span></a> <span class="k">for</span> <span class="n">ac</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_agents</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-54"><a href="#MessageProcessor.new_message-54"><span class="linenos">54</span></a> <span class="k">if</span> <span class="n">ac</span><span class="o">.</span><span class="n">extract_type</span><span class="p">()</span> <span class="ow">in</span> <span class="n">data_types</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-55"><a href="#MessageProcessor.new_message-55"><span class="linenos">55</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ac</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-56"><a href="#MessageProcessor.new_message-56"><span class="linenos">56</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor.new_message-57"><a href="#MessageProcessor.new_message-57"><span class="linenos">57</span></a>
</span><span id="MessageProcessor.new_message-58"><a href="#MessageProcessor.new_message-58"><span class="linenos">58</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-59"><a href="#MessageProcessor.new_message-59"><span class="linenos">59</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor.new_message-60"><a href="#MessageProcessor.new_message-60"><span class="linenos">60</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-61"><a href="#MessageProcessor.new_message-61"><span class="linenos">61</span></a> <span class="k">for</span> <span class="n">sa</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">solve_agents</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-62"><a href="#MessageProcessor.new_message-62"><span class="linenos">62</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">sa</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-63"><a href="#MessageProcessor.new_message-63"><span class="linenos">63</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor.new_message-64"><a href="#MessageProcessor.new_message-64"><span class="linenos">64</span></a>
</span><span id="MessageProcessor.new_message-65"><a href="#MessageProcessor.new_message-65"><span class="linenos">65</span></a> <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-66"><a href="#MessageProcessor.new_message-66"><span class="linenos">66</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor.new_message-67"><a href="#MessageProcessor.new_message-67"><span class="linenos">67</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-68"><a href="#MessageProcessor.new_message-68"><span class="linenos">68</span></a> <span class="k">for</span> <span class="n">ga</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">gatekeeper_agents</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-69"><a href="#MessageProcessor.new_message-69"><span class="linenos">69</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">ga</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-70"><a href="#MessageProcessor.new_message-70"><span class="linenos">70</span></a> <span class="n">enqueued</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor.new_message-71"><a href="#MessageProcessor.new_message-71"><span class="linenos">71</span></a>
</span><span id="MessageProcessor.new_message-72"><a href="#MessageProcessor.new_message-72"><span class="linenos">72</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-73"><a href="#MessageProcessor.new_message-73"><span class="linenos">73</span></a> <span class="p">(</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span><span class="p">)</span> <span class="o">+</span>
</span><span id="MessageProcessor.new_message-74"><a href="#MessageProcessor.new_message-74"><span class="linenos">74</span></a> <span class="sa">f</span><span class="s2">&quot;ID: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> Count: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="MessageProcessor.new_message-75"><a href="#MessageProcessor.new_message-75"><span class="linenos">75</span></a> <span class="p">)</span>
</span><span id="MessageProcessor.new_message-76"><a href="#MessageProcessor.new_message-76"><span class="linenos">76</span></a>
</span><span id="MessageProcessor.new_message-77"><a href="#MessageProcessor.new_message-77"><span class="linenos">77</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="MessageProcessor.new_message-78"><a href="#MessageProcessor.new_message-78"><span class="linenos">78</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-79"><a href="#MessageProcessor.new_message-79"><span class="linenos">79</span></a> <span class="n">count</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-80"><a href="#MessageProcessor.new_message-80"><span class="linenos">80</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added to queue&quot;</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-81"><a href="#MessageProcessor.new_message-81"><span class="linenos">81</span></a> <span class="n">error</span><span class="o">=</span><span class="ow">not</span> <span class="n">enqueued</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-82"><a href="#MessageProcessor.new_message-82"><span class="linenos">82</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="kc">None</span> <span class="k">if</span> <span class="n">enqueued</span> <span class="k">else</span> <span class="s2">&quot;No agent found to queue message.&quot;</span>
</span><span id="MessageProcessor.new_message-83"><a href="#MessageProcessor.new_message-83"><span class="linenos">83</span></a> <span class="p">)</span>
</span></pre></div>

File diff suppressed because one or more lines are too long

View File

@ -114,75 +114,67 @@
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">import</span> <span class="nn">random</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">List</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="kn">from</span> <span class="nn">ums.agent</span> <span class="kn">import</span> <span class="n">ExtractAudioAgent</span><span class="p">,</span> <span class="n">ExtractImageAgent</span><span class="p">,</span> <span class="n">ExtractTextAgent</span><span class="p">,</span> <span class="n">SolveAgent</span><span class="p">,</span> <span class="n">GatekeeperAgent</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Callable</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="kn">from</span> <span class="nn">ums.agent</span> <span class="kn">import</span> <span class="n">ExtractAudioAgent</span><span class="p">,</span> <span class="n">ExtractImageAgent</span><span class="p">,</span> <span class="n">ExtractTextAgent</span><span class="p">,</span> <span class="n">SolveAgent</span><span class="p">,</span> <span class="n">GatekeeperAgent</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="kn">from</span> <span class="nn">ums.utils.types</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">RiddleData</span><span class="p">,</span> <span class="n">RiddleSolution</span><span class="p">,</span> <span class="n">RiddleStatus</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="kn">from</span> <span class="nn">ums.utils</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">RiddleData</span><span class="p">,</span> <span class="n">RiddleSolution</span><span class="p">,</span> <span class="n">RiddleStatus</span><span class="p">,</span> <span class="n">ExtractedData</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="sd"> Examples for simple agents.</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="sd"> Examples for simple agents.</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="sd"> Each agent is represented by its own class. The handling of tasks is done by `handle()` in each agent.</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="sd"> Each agent is represented by its own class. The handling of tasks is done by `handle()` in each agent.</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="sd"> Finally `AGENT_CLASSES` contains the classes of the agents in a list. Via environmental variables this list is specified to the ums.agent system. </span>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="sd"> Finally `AGENT_CLASSES` contains the classes of the agents in a list. Via environmental variables this list is specified to the ums.agent system. </span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="k">class</span> <span class="nc">MyExtractAudioAgent</span><span class="p">(</span><span class="n">ExtractAudioAgent</span><span class="p">):</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="k">class</span> <span class="nc">MyExtractAudioAgent</span><span class="p">(</span><span class="n">ExtractAudioAgent</span><span class="p">):</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Audio Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="k">return</span> <span class="n">data</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Audio Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="k">return</span> <span class="n">data</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a><span class="k">class</span> <span class="nc">MyExtractImageAgent</span><span class="p">(</span><span class="n">ExtractImageAgent</span><span class="p">):</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a><span class="k">class</span> <span class="nc">MyExtractImageAgent</span><span class="p">(</span><span class="n">ExtractImageAgent</span><span class="p">):</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Image Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="n">extracted</span> <span class="o">=</span> <span class="n">ExtractedData</span><span class="p">(</span><span class="n">other</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;info&quot;</span><span class="p">:</span><span class="s2">&quot;just a test&quot;</span><span class="p">})</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">data</span><span class="o">.</span><span class="n">file_extracted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">store_extracted</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">extracted</span><span class="p">)</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="k">return</span> <span class="n">data</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a><span class="k">class</span> <span class="nc">MyExtractTextAgent</span><span class="p">(</span><span class="n">ExtractTextAgent</span><span class="p">):</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="k">def</span> <span class="nf">before_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">:</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">send_it</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="kc">None</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The response will be:&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Image Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="k">return</span> <span class="n">data</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a><span class="k">class</span> <span class="nc">MyExtractTextAgent</span><span class="p">(</span><span class="n">ExtractTextAgent</span><span class="p">):</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="k">def</span> <span class="nf">before_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">:</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">send_it</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="kc">None</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The response will be:&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Text Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="k">return</span> <span class="n">data</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Text Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="k">return</span> <span class="n">data</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a><span class="k">class</span> <span class="nc">MySolveAgent</span><span class="p">(</span><span class="n">SolveAgent</span><span class="p">):</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a><span class="k">class</span> <span class="nc">MySolveAgent</span><span class="p">(</span><span class="n">SolveAgent</span><span class="p">):</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">RiddleData</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">()</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="s2">&quot;test&quot;</span><span class="p">:</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a> <span class="n">status</span> <span class="o">=</span> <span class="n">RiddleStatus</span><span class="p">()</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a> <span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sub_riddle</span><span class="p">(</span><span class="n">riddle</span><span class="o">=</span><span class="n">Riddle</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="s2">&quot;Haha&quot;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s2">&quot;Blubber&quot;</span><span class="p">),</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a> <span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_extracted</span><span class="p">(</span><span class="n">d</span><span class="p">))</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a> <span class="k">return</span> <span class="n">RiddleSolution</span><span class="p">(</span><span class="n">solution</span><span class="o">=</span><span class="s2">&quot;Huii&quot;</span><span class="p">,</span> <span class="n">explanation</span><span class="o">=</span><span class="s2">&quot;Blubb&quot;</span><span class="p">)</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a>
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a>
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">()</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="s2">&quot;test&quot;</span><span class="p">:</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a> <span class="n">status</span> <span class="o">=</span> <span class="n">RiddleStatus</span><span class="p">()</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a> <span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sub_riddle</span><span class="p">(</span><span class="n">riddle</span><span class="o">=</span><span class="n">Riddle</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="s2">&quot;Haha&quot;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s2">&quot;Blubber&quot;</span><span class="p">),</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a> <span class="k">return</span> <span class="n">RiddleSolution</span><span class="p">(</span><span class="n">solution</span><span class="o">=</span><span class="s2">&quot;Huii&quot;</span><span class="p">,</span> <span class="n">explanation</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;Blubb, </span><span class="si">{</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a>
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a><span class="k">class</span> <span class="nc">MyGatekeeperAgent</span><span class="p">(</span><span class="n">GatekeeperAgent</span><span class="p">):</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span> <span class="n">RiddleSolution</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">accepted</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">review</span> <span class="o">=</span> <span class="s2">&quot;Ok&quot;</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a> <span class="k">return</span> <span class="n">solution</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a><span class="k">class</span> <span class="nc">MyGatekeeperAgent</span><span class="p">(</span><span class="n">GatekeeperAgent</span><span class="p">):</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">RiddleSolution</span><span class="p">],</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a> <span class="n">solution</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">accepted</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a> <span class="n">solution</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">review</span> <span class="o">=</span> <span class="s2">&quot;Ok&quot;</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a>
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a> <span class="k">return</span> <span class="n">solution</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a>
</span><span id="L-75"><a href="#L-75"><span class="linenos">75</span></a><span class="n">AGENT_CLASSES</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="n">MyExtractAudioAgent</span><span class="p">,</span> <span class="n">MyExtractImageAgent</span><span class="p">,</span> <span class="n">MyExtractTextAgent</span><span class="p">,</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos">77</span></a> <span class="n">MySolveAgent</span><span class="p">,</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a> <span class="n">MyGatekeeperAgent</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a><span class="p">]</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a><span class="n">AGENT_CLASSES</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a> <span class="n">MyExtractAudioAgent</span><span class="p">,</span> <span class="n">MyExtractImageAgent</span><span class="p">,</span> <span class="n">MyExtractTextAgent</span><span class="p">,</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a> <span class="n">MySolveAgent</span><span class="p">,</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a> <span class="n">MyGatekeeperAgent</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a><span class="p">]</span>
</span></pre></div>
@ -198,11 +190,11 @@
</div>
<a class="headerlink" href="#MyExtractAudioAgent"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractAudioAgent-27"><a href="#MyExtractAudioAgent-27"><span class="linenos">27</span></a><span class="k">class</span> <span class="nc">MyExtractAudioAgent</span><span class="p">(</span><span class="n">ExtractAudioAgent</span><span class="p">):</span>
</span><span id="MyExtractAudioAgent-28"><a href="#MyExtractAudioAgent-28"><span class="linenos">28</span></a>
</span><span id="MyExtractAudioAgent-29"><a href="#MyExtractAudioAgent-29"><span class="linenos">29</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractAudioAgent-30"><a href="#MyExtractAudioAgent-30"><span class="linenos">30</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Audio Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractAudioAgent-31"><a href="#MyExtractAudioAgent-31"><span class="linenos">31</span></a> <span class="k">return</span> <span class="n">data</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractAudioAgent-25"><a href="#MyExtractAudioAgent-25"><span class="linenos">25</span></a><span class="k">class</span> <span class="nc">MyExtractAudioAgent</span><span class="p">(</span><span class="n">ExtractAudioAgent</span><span class="p">):</span>
</span><span id="MyExtractAudioAgent-26"><a href="#MyExtractAudioAgent-26"><span class="linenos">26</span></a>
</span><span id="MyExtractAudioAgent-27"><a href="#MyExtractAudioAgent-27"><span class="linenos">27</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractAudioAgent-28"><a href="#MyExtractAudioAgent-28"><span class="linenos">28</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Audio Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractAudioAgent-29"><a href="#MyExtractAudioAgent-29"><span class="linenos">29</span></a> <span class="k">return</span> <span class="n">data</span>
</span></pre></div>
@ -221,9 +213,9 @@
</div>
<a class="headerlink" href="#MyExtractAudioAgent.handle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractAudioAgent.handle-29"><a href="#MyExtractAudioAgent.handle-29"><span class="linenos">29</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractAudioAgent.handle-30"><a href="#MyExtractAudioAgent.handle-30"><span class="linenos">30</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Audio Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractAudioAgent.handle-31"><a href="#MyExtractAudioAgent.handle-31"><span class="linenos">31</span></a> <span class="k">return</span> <span class="n">data</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractAudioAgent.handle-27"><a href="#MyExtractAudioAgent.handle-27"><span class="linenos">27</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractAudioAgent.handle-28"><a href="#MyExtractAudioAgent.handle-28"><span class="linenos">28</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Audio Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractAudioAgent.handle-29"><a href="#MyExtractAudioAgent.handle-29"><span class="linenos">29</span></a> <span class="k">return</span> <span class="n">data</span>
</span></pre></div>
@ -240,7 +232,6 @@
<dd id="MyExtractAudioAgent.before_response" class="function"><a href="../agent/agent.html#BasicAgent.before_response">before_response</a></dd>
<dd id="MyExtractAudioAgent.message" class="function"><a href="../agent/agent.html#BasicAgent.message">message</a></dd>
<dd id="MyExtractAudioAgent.sub_riddle" class="function"><a href="../agent/agent.html#BasicAgent.sub_riddle">sub_riddle</a></dd>
<dd id="MyExtractAudioAgent.get_extracted" class="function"><a href="../agent/agent.html#BasicAgent.get_extracted">get_extracted</a></dd>
</div>
<div><dt><a href="../agent/agent.html#ExtractAudioAgent">ums.agent.agent.ExtractAudioAgent</a></dt>
@ -249,7 +240,6 @@
</div>
<div><dt><a href="../agent/agent.html#ExtractAgent">ums.agent.agent.ExtractAgent</a></dt>
<dd id="MyExtractAudioAgent.agent_capability" class="function"><a href="../agent/agent.html#ExtractAgent.agent_capability">agent_capability</a></dd>
<dd id="MyExtractAudioAgent.store_extracted" class="function"><a href="../agent/agent.html#ExtractAgent.store_extracted">store_extracted</a></dd>
</div>
</dl>
@ -266,14 +256,11 @@
</div>
<a class="headerlink" href="#MyExtractImageAgent"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractImageAgent-33"><a href="#MyExtractImageAgent-33"><span class="linenos">33</span></a><span class="k">class</span> <span class="nc">MyExtractImageAgent</span><span class="p">(</span><span class="n">ExtractImageAgent</span><span class="p">):</span>
</span><span id="MyExtractImageAgent-34"><a href="#MyExtractImageAgent-34"><span class="linenos">34</span></a>
</span><span id="MyExtractImageAgent-35"><a href="#MyExtractImageAgent-35"><span class="linenos">35</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractImageAgent-36"><a href="#MyExtractImageAgent-36"><span class="linenos">36</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Image Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractImageAgent-37"><a href="#MyExtractImageAgent-37"><span class="linenos">37</span></a>
</span><span id="MyExtractImageAgent-38"><a href="#MyExtractImageAgent-38"><span class="linenos">38</span></a> <span class="n">extracted</span> <span class="o">=</span> <span class="n">ExtractedData</span><span class="p">(</span><span class="n">other</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;info&quot;</span><span class="p">:</span><span class="s2">&quot;just a test&quot;</span><span class="p">})</span>
</span><span id="MyExtractImageAgent-39"><a href="#MyExtractImageAgent-39"><span class="linenos">39</span></a> <span class="n">data</span><span class="o">.</span><span class="n">file_extracted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">store_extracted</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">extracted</span><span class="p">)</span>
</span><span id="MyExtractImageAgent-40"><a href="#MyExtractImageAgent-40"><span class="linenos">40</span></a> <span class="k">return</span> <span class="n">data</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractImageAgent-31"><a href="#MyExtractImageAgent-31"><span class="linenos">31</span></a><span class="k">class</span> <span class="nc">MyExtractImageAgent</span><span class="p">(</span><span class="n">ExtractImageAgent</span><span class="p">):</span>
</span><span id="MyExtractImageAgent-32"><a href="#MyExtractImageAgent-32"><span class="linenos">32</span></a>
</span><span id="MyExtractImageAgent-33"><a href="#MyExtractImageAgent-33"><span class="linenos">33</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractImageAgent-34"><a href="#MyExtractImageAgent-34"><span class="linenos">34</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Image Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractImageAgent-35"><a href="#MyExtractImageAgent-35"><span class="linenos">35</span></a> <span class="k">return</span> <span class="n">data</span>
</span></pre></div>
@ -292,12 +279,9 @@
</div>
<a class="headerlink" href="#MyExtractImageAgent.handle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractImageAgent.handle-35"><a href="#MyExtractImageAgent.handle-35"><span class="linenos">35</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractImageAgent.handle-36"><a href="#MyExtractImageAgent.handle-36"><span class="linenos">36</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Image Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractImageAgent.handle-37"><a href="#MyExtractImageAgent.handle-37"><span class="linenos">37</span></a>
</span><span id="MyExtractImageAgent.handle-38"><a href="#MyExtractImageAgent.handle-38"><span class="linenos">38</span></a> <span class="n">extracted</span> <span class="o">=</span> <span class="n">ExtractedData</span><span class="p">(</span><span class="n">other</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;info&quot;</span><span class="p">:</span><span class="s2">&quot;just a test&quot;</span><span class="p">})</span>
</span><span id="MyExtractImageAgent.handle-39"><a href="#MyExtractImageAgent.handle-39"><span class="linenos">39</span></a> <span class="n">data</span><span class="o">.</span><span class="n">file_extracted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">store_extracted</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">extracted</span><span class="p">)</span>
</span><span id="MyExtractImageAgent.handle-40"><a href="#MyExtractImageAgent.handle-40"><span class="linenos">40</span></a> <span class="k">return</span> <span class="n">data</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractImageAgent.handle-33"><a href="#MyExtractImageAgent.handle-33"><span class="linenos">33</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractImageAgent.handle-34"><a href="#MyExtractImageAgent.handle-34"><span class="linenos">34</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Image Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractImageAgent.handle-35"><a href="#MyExtractImageAgent.handle-35"><span class="linenos">35</span></a> <span class="k">return</span> <span class="n">data</span>
</span></pre></div>
@ -314,7 +298,6 @@
<dd id="MyExtractImageAgent.before_response" class="function"><a href="../agent/agent.html#BasicAgent.before_response">before_response</a></dd>
<dd id="MyExtractImageAgent.message" class="function"><a href="../agent/agent.html#BasicAgent.message">message</a></dd>
<dd id="MyExtractImageAgent.sub_riddle" class="function"><a href="../agent/agent.html#BasicAgent.sub_riddle">sub_riddle</a></dd>
<dd id="MyExtractImageAgent.get_extracted" class="function"><a href="../agent/agent.html#BasicAgent.get_extracted">get_extracted</a></dd>
</div>
<div><dt><a href="../agent/agent.html#ExtractImageAgent">ums.agent.agent.ExtractImageAgent</a></dt>
@ -323,7 +306,6 @@
</div>
<div><dt><a href="../agent/agent.html#ExtractAgent">ums.agent.agent.ExtractAgent</a></dt>
<dd id="MyExtractImageAgent.agent_capability" class="function"><a href="../agent/agent.html#ExtractAgent.agent_capability">agent_capability</a></dd>
<dd id="MyExtractImageAgent.store_extracted" class="function"><a href="../agent/agent.html#ExtractAgent.store_extracted">store_extracted</a></dd>
</div>
</dl>
@ -340,15 +322,15 @@
</div>
<a class="headerlink" href="#MyExtractTextAgent"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractTextAgent-42"><a href="#MyExtractTextAgent-42"><span class="linenos">42</span></a><span class="k">class</span> <span class="nc">MyExtractTextAgent</span><span class="p">(</span><span class="n">ExtractTextAgent</span><span class="p">):</span>
</span><span id="MyExtractTextAgent-43"><a href="#MyExtractTextAgent-43"><span class="linenos">43</span></a>
</span><span id="MyExtractTextAgent-44"><a href="#MyExtractTextAgent-44"><span class="linenos">44</span></a> <span class="k">def</span> <span class="nf">before_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">:</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">send_it</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="kc">None</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MyExtractTextAgent-45"><a href="#MyExtractTextAgent-45"><span class="linenos">45</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The response will be:&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
</span><span id="MyExtractTextAgent-46"><a href="#MyExtractTextAgent-46"><span class="linenos">46</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MyExtractTextAgent-47"><a href="#MyExtractTextAgent-47"><span class="linenos">47</span></a>
</span><span id="MyExtractTextAgent-48"><a href="#MyExtractTextAgent-48"><span class="linenos">48</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractTextAgent-49"><a href="#MyExtractTextAgent-49"><span class="linenos">49</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Text Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractTextAgent-50"><a href="#MyExtractTextAgent-50"><span class="linenos">50</span></a> <span class="k">return</span> <span class="n">data</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractTextAgent-37"><a href="#MyExtractTextAgent-37"><span class="linenos">37</span></a><span class="k">class</span> <span class="nc">MyExtractTextAgent</span><span class="p">(</span><span class="n">ExtractTextAgent</span><span class="p">):</span>
</span><span id="MyExtractTextAgent-38"><a href="#MyExtractTextAgent-38"><span class="linenos">38</span></a>
</span><span id="MyExtractTextAgent-39"><a href="#MyExtractTextAgent-39"><span class="linenos">39</span></a> <span class="k">def</span> <span class="nf">before_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">:</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">send_it</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="kc">None</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MyExtractTextAgent-40"><a href="#MyExtractTextAgent-40"><span class="linenos">40</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The response will be:&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
</span><span id="MyExtractTextAgent-41"><a href="#MyExtractTextAgent-41"><span class="linenos">41</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MyExtractTextAgent-42"><a href="#MyExtractTextAgent-42"><span class="linenos">42</span></a>
</span><span id="MyExtractTextAgent-43"><a href="#MyExtractTextAgent-43"><span class="linenos">43</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractTextAgent-44"><a href="#MyExtractTextAgent-44"><span class="linenos">44</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Text Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractTextAgent-45"><a href="#MyExtractTextAgent-45"><span class="linenos">45</span></a> <span class="k">return</span> <span class="n">data</span>
</span></pre></div>
@ -367,9 +349,9 @@
</div>
<a class="headerlink" href="#MyExtractTextAgent.before_response"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractTextAgent.before_response-44"><a href="#MyExtractTextAgent.before_response-44"><span class="linenos">44</span></a> <span class="k">def</span> <span class="nf">before_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">:</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">send_it</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="kc">None</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MyExtractTextAgent.before_response-45"><a href="#MyExtractTextAgent.before_response-45"><span class="linenos">45</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The response will be:&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
</span><span id="MyExtractTextAgent.before_response-46"><a href="#MyExtractTextAgent.before_response-46"><span class="linenos">46</span></a> <span class="k">return</span> <span class="kc">True</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractTextAgent.before_response-39"><a href="#MyExtractTextAgent.before_response-39"><span class="linenos">39</span></a> <span class="k">def</span> <span class="nf">before_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">:</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">send_it</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="kc">None</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MyExtractTextAgent.before_response-40"><a href="#MyExtractTextAgent.before_response-40"><span class="linenos">40</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The response will be:&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
</span><span id="MyExtractTextAgent.before_response-41"><a href="#MyExtractTextAgent.before_response-41"><span class="linenos">41</span></a> <span class="k">return</span> <span class="kc">True</span>
</span></pre></div>
@ -394,9 +376,9 @@ Thus, by overwriting this method, a response can be prevented.</p>
</div>
<a class="headerlink" href="#MyExtractTextAgent.handle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractTextAgent.handle-48"><a href="#MyExtractTextAgent.handle-48"><span class="linenos">48</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractTextAgent.handle-49"><a href="#MyExtractTextAgent.handle-49"><span class="linenos">49</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Text Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractTextAgent.handle-50"><a href="#MyExtractTextAgent.handle-50"><span class="linenos">50</span></a> <span class="k">return</span> <span class="n">data</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyExtractTextAgent.handle-43"><a href="#MyExtractTextAgent.handle-43"><span class="linenos">43</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleData</span><span class="p">:</span>
</span><span id="MyExtractTextAgent.handle-44"><a href="#MyExtractTextAgent.handle-44"><span class="linenos">44</span></a> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Text Process:&quot;</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">file_plain</span><span class="p">)</span>
</span><span id="MyExtractTextAgent.handle-45"><a href="#MyExtractTextAgent.handle-45"><span class="linenos">45</span></a> <span class="k">return</span> <span class="n">data</span>
</span></pre></div>
@ -412,7 +394,6 @@ Thus, by overwriting this method, a response can be prevented.</p>
<dd id="MyExtractTextAgent.__init__" class="function"><a href="../agent/agent.html#BasicAgent.__init__">BasicAgent</a></dd>
<dd id="MyExtractTextAgent.message" class="function"><a href="../agent/agent.html#BasicAgent.message">message</a></dd>
<dd id="MyExtractTextAgent.sub_riddle" class="function"><a href="../agent/agent.html#BasicAgent.sub_riddle">sub_riddle</a></dd>
<dd id="MyExtractTextAgent.get_extracted" class="function"><a href="../agent/agent.html#BasicAgent.get_extracted">get_extracted</a></dd>
</div>
<div><dt><a href="../agent/agent.html#ExtractTextAgent">ums.agent.agent.ExtractTextAgent</a></dt>
@ -421,7 +402,6 @@ Thus, by overwriting this method, a response can be prevented.</p>
</div>
<div><dt><a href="../agent/agent.html#ExtractAgent">ums.agent.agent.ExtractAgent</a></dt>
<dd id="MyExtractTextAgent.agent_capability" class="function"><a href="../agent/agent.html#ExtractAgent.agent_capability">agent_capability</a></dd>
<dd id="MyExtractTextAgent.store_extracted" class="function"><a href="../agent/agent.html#ExtractAgent.store_extracted">store_extracted</a></dd>
</div>
</dl>
@ -438,19 +418,16 @@ Thus, by overwriting this method, a response can be prevented.</p>
</div>
<a class="headerlink" href="#MySolveAgent"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MySolveAgent-53"><a href="#MySolveAgent-53"><span class="linenos">53</span></a><span class="k">class</span> <span class="nc">MySolveAgent</span><span class="p">(</span><span class="n">SolveAgent</span><span class="p">):</span>
</span><span id="MySolveAgent-54"><a href="#MySolveAgent-54"><span class="linenos">54</span></a>
</span><span id="MySolveAgent-55"><a href="#MySolveAgent-55"><span class="linenos">55</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">RiddleData</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MySolveAgent-48"><a href="#MySolveAgent-48"><span class="linenos">48</span></a><span class="k">class</span> <span class="nc">MySolveAgent</span><span class="p">(</span><span class="n">SolveAgent</span><span class="p">):</span>
</span><span id="MySolveAgent-49"><a href="#MySolveAgent-49"><span class="linenos">49</span></a>
</span><span id="MySolveAgent-50"><a href="#MySolveAgent-50"><span class="linenos">50</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="MySolveAgent-51"><a href="#MySolveAgent-51"><span class="linenos">51</span></a>
</span><span id="MySolveAgent-52"><a href="#MySolveAgent-52"><span class="linenos">52</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">()</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="s2">&quot;test&quot;</span><span class="p">:</span>
</span><span id="MySolveAgent-53"><a href="#MySolveAgent-53"><span class="linenos">53</span></a> <span class="n">status</span> <span class="o">=</span> <span class="n">RiddleStatus</span><span class="p">()</span>
</span><span id="MySolveAgent-54"><a href="#MySolveAgent-54"><span class="linenos">54</span></a> <span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MySolveAgent-55"><a href="#MySolveAgent-55"><span class="linenos">55</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sub_riddle</span><span class="p">(</span><span class="n">riddle</span><span class="o">=</span><span class="n">Riddle</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="s2">&quot;Haha&quot;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s2">&quot;Blubber&quot;</span><span class="p">),</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span>
</span><span id="MySolveAgent-56"><a href="#MySolveAgent-56"><span class="linenos">56</span></a>
</span><span id="MySolveAgent-57"><a href="#MySolveAgent-57"><span class="linenos">57</span></a> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span><span id="MySolveAgent-58"><a href="#MySolveAgent-58"><span class="linenos">58</span></a> <span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_extracted</span><span class="p">(</span><span class="n">d</span><span class="p">))</span>
</span><span id="MySolveAgent-59"><a href="#MySolveAgent-59"><span class="linenos">59</span></a>
</span><span id="MySolveAgent-60"><a href="#MySolveAgent-60"><span class="linenos">60</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">()</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="s2">&quot;test&quot;</span><span class="p">:</span>
</span><span id="MySolveAgent-61"><a href="#MySolveAgent-61"><span class="linenos">61</span></a> <span class="n">status</span> <span class="o">=</span> <span class="n">RiddleStatus</span><span class="p">()</span>
</span><span id="MySolveAgent-62"><a href="#MySolveAgent-62"><span class="linenos">62</span></a> <span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MySolveAgent-63"><a href="#MySolveAgent-63"><span class="linenos">63</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sub_riddle</span><span class="p">(</span><span class="n">riddle</span><span class="o">=</span><span class="n">Riddle</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="s2">&quot;Haha&quot;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s2">&quot;Blubber&quot;</span><span class="p">),</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span>
</span><span id="MySolveAgent-64"><a href="#MySolveAgent-64"><span class="linenos">64</span></a>
</span><span id="MySolveAgent-65"><a href="#MySolveAgent-65"><span class="linenos">65</span></a> <span class="k">return</span> <span class="n">RiddleSolution</span><span class="p">(</span><span class="n">solution</span><span class="o">=</span><span class="s2">&quot;Huii&quot;</span><span class="p">,</span> <span class="n">explanation</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;Blubb, </span><span class="si">{</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MySolveAgent-57"><a href="#MySolveAgent-57"><span class="linenos">57</span></a> <span class="k">return</span> <span class="n">RiddleSolution</span><span class="p">(</span><span class="n">solution</span><span class="o">=</span><span class="s2">&quot;Huii&quot;</span><span class="p">,</span> <span class="n">explanation</span><span class="o">=</span><span class="s2">&quot;Blubb&quot;</span><span class="p">)</span>
</span></pre></div>
@ -463,27 +440,24 @@ Thus, by overwriting this method, a response can be prevented.</p>
<div class="attr function">
<span class="def">def</span>
<span class="name">handle</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">riddle</span><span class="p">:</span> <span class="n"><a href="../utils/types.html#Riddle">ums.utils.types.Riddle</a></span>,</span><span class="param"> <span class="n">data</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n"><a href="../utils/types.html#RiddleData">ums.utils.types.RiddleData</a></span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="../utils/types.html#RiddleSolution">ums.utils.types.RiddleSolution</a></span>:</span></span>
<span class="name">handle</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">riddle</span><span class="p">:</span> <span class="n"><a href="../utils/types.html#Riddle">ums.utils.types.Riddle</a></span>,</span><span class="param"> <span class="n">data</span><span class="p">:</span> <span class="n"><a href="../utils/types.html#RiddleData">ums.utils.types.RiddleData</a></span></span><span class="return-annotation">) -> <span class="n"><a href="../utils/types.html#RiddleSolution">ums.utils.types.RiddleSolution</a></span>:</span></span>
<label class="view-source-button" for="MySolveAgent.handle-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#MySolveAgent.handle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MySolveAgent.handle-55"><a href="#MySolveAgent.handle-55"><span class="linenos">55</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">RiddleData</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MySolveAgent.handle-50"><a href="#MySolveAgent.handle-50"><span class="linenos">50</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="MySolveAgent.handle-51"><a href="#MySolveAgent.handle-51"><span class="linenos">51</span></a>
</span><span id="MySolveAgent.handle-52"><a href="#MySolveAgent.handle-52"><span class="linenos">52</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">()</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="s2">&quot;test&quot;</span><span class="p">:</span>
</span><span id="MySolveAgent.handle-53"><a href="#MySolveAgent.handle-53"><span class="linenos">53</span></a> <span class="n">status</span> <span class="o">=</span> <span class="n">RiddleStatus</span><span class="p">()</span>
</span><span id="MySolveAgent.handle-54"><a href="#MySolveAgent.handle-54"><span class="linenos">54</span></a> <span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MySolveAgent.handle-55"><a href="#MySolveAgent.handle-55"><span class="linenos">55</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sub_riddle</span><span class="p">(</span><span class="n">riddle</span><span class="o">=</span><span class="n">Riddle</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="s2">&quot;Haha&quot;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s2">&quot;Blubber&quot;</span><span class="p">),</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span>
</span><span id="MySolveAgent.handle-56"><a href="#MySolveAgent.handle-56"><span class="linenos">56</span></a>
</span><span id="MySolveAgent.handle-57"><a href="#MySolveAgent.handle-57"><span class="linenos">57</span></a> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span><span id="MySolveAgent.handle-58"><a href="#MySolveAgent.handle-58"><span class="linenos">58</span></a> <span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_extracted</span><span class="p">(</span><span class="n">d</span><span class="p">))</span>
</span><span id="MySolveAgent.handle-59"><a href="#MySolveAgent.handle-59"><span class="linenos">59</span></a>
</span><span id="MySolveAgent.handle-60"><a href="#MySolveAgent.handle-60"><span class="linenos">60</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">()</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="s2">&quot;test&quot;</span><span class="p">:</span>
</span><span id="MySolveAgent.handle-61"><a href="#MySolveAgent.handle-61"><span class="linenos">61</span></a> <span class="n">status</span> <span class="o">=</span> <span class="n">RiddleStatus</span><span class="p">()</span>
</span><span id="MySolveAgent.handle-62"><a href="#MySolveAgent.handle-62"><span class="linenos">62</span></a> <span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MySolveAgent.handle-63"><a href="#MySolveAgent.handle-63"><span class="linenos">63</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sub_riddle</span><span class="p">(</span><span class="n">riddle</span><span class="o">=</span><span class="n">Riddle</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="s2">&quot;Haha&quot;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s2">&quot;Blubber&quot;</span><span class="p">),</span> <span class="n">status</span><span class="o">=</span><span class="n">status</span><span class="p">)</span>
</span><span id="MySolveAgent.handle-64"><a href="#MySolveAgent.handle-64"><span class="linenos">64</span></a>
</span><span id="MySolveAgent.handle-65"><a href="#MySolveAgent.handle-65"><span class="linenos">65</span></a> <span class="k">return</span> <span class="n">RiddleSolution</span><span class="p">(</span><span class="n">solution</span><span class="o">=</span><span class="s2">&quot;Huii&quot;</span><span class="p">,</span> <span class="n">explanation</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;Blubb, </span><span class="si">{</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MySolveAgent.handle-57"><a href="#MySolveAgent.handle-57"><span class="linenos">57</span></a> <span class="k">return</span> <span class="n">RiddleSolution</span><span class="p">(</span><span class="n">solution</span><span class="o">=</span><span class="s2">&quot;Huii&quot;</span><span class="p">,</span> <span class="n">explanation</span><span class="o">=</span><span class="s2">&quot;Blubb&quot;</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>Solve the <code>riddle</code> using <code>data</code> and return a single solution.</p>
<div class="docstring"><p>Solve the <code>riddle</code> using <code>data</code> and return a solution.</p>
</div>
@ -496,7 +470,6 @@ Thus, by overwriting this method, a response can be prevented.</p>
<dd id="MySolveAgent.before_response" class="function"><a href="../agent/agent.html#BasicAgent.before_response">before_response</a></dd>
<dd id="MySolveAgent.message" class="function"><a href="../agent/agent.html#BasicAgent.message">message</a></dd>
<dd id="MySolveAgent.sub_riddle" class="function"><a href="../agent/agent.html#BasicAgent.sub_riddle">sub_riddle</a></dd>
<dd id="MySolveAgent.get_extracted" class="function"><a href="../agent/agent.html#BasicAgent.get_extracted">get_extracted</a></dd>
</div>
<div><dt><a href="../agent/agent.html#SolveAgent">ums.agent.agent.SolveAgent</a></dt>
@ -517,13 +490,13 @@ Thus, by overwriting this method, a response can be prevented.</p>
</div>
<a class="headerlink" href="#MyGatekeeperAgent"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyGatekeeperAgent-68"><a href="#MyGatekeeperAgent-68"><span class="linenos">68</span></a><span class="k">class</span> <span class="nc">MyGatekeeperAgent</span><span class="p">(</span><span class="n">GatekeeperAgent</span><span class="p">):</span>
</span><span id="MyGatekeeperAgent-69"><a href="#MyGatekeeperAgent-69"><span class="linenos">69</span></a>
</span><span id="MyGatekeeperAgent-70"><a href="#MyGatekeeperAgent-70"><span class="linenos">70</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">RiddleSolution</span><span class="p">],</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="MyGatekeeperAgent-71"><a href="#MyGatekeeperAgent-71"><span class="linenos">71</span></a> <span class="n">solution</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">accepted</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MyGatekeeperAgent-72"><a href="#MyGatekeeperAgent-72"><span class="linenos">72</span></a> <span class="n">solution</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">review</span> <span class="o">=</span> <span class="s2">&quot;Ok&quot;</span>
</span><span id="MyGatekeeperAgent-73"><a href="#MyGatekeeperAgent-73"><span class="linenos">73</span></a>
</span><span id="MyGatekeeperAgent-74"><a href="#MyGatekeeperAgent-74"><span class="linenos">74</span></a> <span class="k">return</span> <span class="n">solution</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyGatekeeperAgent-60"><a href="#MyGatekeeperAgent-60"><span class="linenos">60</span></a><span class="k">class</span> <span class="nc">MyGatekeeperAgent</span><span class="p">(</span><span class="n">GatekeeperAgent</span><span class="p">):</span>
</span><span id="MyGatekeeperAgent-61"><a href="#MyGatekeeperAgent-61"><span class="linenos">61</span></a>
</span><span id="MyGatekeeperAgent-62"><a href="#MyGatekeeperAgent-62"><span class="linenos">62</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span> <span class="n">RiddleSolution</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="MyGatekeeperAgent-63"><a href="#MyGatekeeperAgent-63"><span class="linenos">63</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">accepted</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MyGatekeeperAgent-64"><a href="#MyGatekeeperAgent-64"><span class="linenos">64</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">review</span> <span class="o">=</span> <span class="s2">&quot;Ok&quot;</span>
</span><span id="MyGatekeeperAgent-65"><a href="#MyGatekeeperAgent-65"><span class="linenos">65</span></a>
</span><span id="MyGatekeeperAgent-66"><a href="#MyGatekeeperAgent-66"><span class="linenos">66</span></a> <span class="k">return</span> <span class="n">solution</span>
</span></pre></div>
@ -536,21 +509,21 @@ Thus, by overwriting this method, a response can be prevented.</p>
<div class="attr function">
<span class="def">def</span>
<span class="name">handle</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">solution</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n"><a href="../utils/types.html#RiddleSolution">ums.utils.types.RiddleSolution</a></span><span class="p">]</span>,</span><span class="param"> <span class="n">riddle</span><span class="p">:</span> <span class="n"><a href="../utils/types.html#Riddle">ums.utils.types.Riddle</a></span></span><span class="return-annotation">) -> <span class="n"><a href="../utils/types.html#RiddleSolution">ums.utils.types.RiddleSolution</a></span>:</span></span>
<span class="name">handle</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">solution</span><span class="p">:</span> <span class="n"><a href="../utils/types.html#RiddleSolution">ums.utils.types.RiddleSolution</a></span>,</span><span class="param"> <span class="n">riddle</span><span class="p">:</span> <span class="n"><a href="../utils/types.html#Riddle">ums.utils.types.Riddle</a></span></span><span class="return-annotation">) -> <span class="n"><a href="../utils/types.html#RiddleSolution">ums.utils.types.RiddleSolution</a></span>:</span></span>
<label class="view-source-button" for="MyGatekeeperAgent.handle-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#MyGatekeeperAgent.handle"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyGatekeeperAgent.handle-70"><a href="#MyGatekeeperAgent.handle-70"><span class="linenos">70</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">RiddleSolution</span><span class="p">],</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="MyGatekeeperAgent.handle-71"><a href="#MyGatekeeperAgent.handle-71"><span class="linenos">71</span></a> <span class="n">solution</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">accepted</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MyGatekeeperAgent.handle-72"><a href="#MyGatekeeperAgent.handle-72"><span class="linenos">72</span></a> <span class="n">solution</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">review</span> <span class="o">=</span> <span class="s2">&quot;Ok&quot;</span>
</span><span id="MyGatekeeperAgent.handle-73"><a href="#MyGatekeeperAgent.handle-73"><span class="linenos">73</span></a>
</span><span id="MyGatekeeperAgent.handle-74"><a href="#MyGatekeeperAgent.handle-74"><span class="linenos">74</span></a> <span class="k">return</span> <span class="n">solution</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MyGatekeeperAgent.handle-62"><a href="#MyGatekeeperAgent.handle-62"><span class="linenos">62</span></a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span> <span class="n">RiddleSolution</span><span class="p">,</span> <span class="n">riddle</span><span class="p">:</span> <span class="n">Riddle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RiddleSolution</span><span class="p">:</span>
</span><span id="MyGatekeeperAgent.handle-63"><a href="#MyGatekeeperAgent.handle-63"><span class="linenos">63</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">accepted</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MyGatekeeperAgent.handle-64"><a href="#MyGatekeeperAgent.handle-64"><span class="linenos">64</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">review</span> <span class="o">=</span> <span class="s2">&quot;Ok&quot;</span>
</span><span id="MyGatekeeperAgent.handle-65"><a href="#MyGatekeeperAgent.handle-65"><span class="linenos">65</span></a>
</span><span id="MyGatekeeperAgent.handle-66"><a href="#MyGatekeeperAgent.handle-66"><span class="linenos">66</span></a> <span class="k">return</span> <span class="n">solution</span>
</span></pre></div>
<div class="docstring"><p>Check the <code>solution</code> (multiple if multiple solver involved) of <code>riddle</code> and return solutions with populated <code>solution[i].accepted</code> and <code>solution[i].review</code>.</p>
<div class="docstring"><p>Check the <code>solution</code> of <code>riddle</code> and return solution with populated <code>solution.accepted</code> and <code>solution.review</code>.</p>
</div>
@ -563,7 +536,6 @@ Thus, by overwriting this method, a response can be prevented.</p>
<dd id="MyGatekeeperAgent.before_response" class="function"><a href="../agent/agent.html#BasicAgent.before_response">before_response</a></dd>
<dd id="MyGatekeeperAgent.message" class="function"><a href="../agent/agent.html#BasicAgent.message">message</a></dd>
<dd id="MyGatekeeperAgent.sub_riddle" class="function"><a href="../agent/agent.html#BasicAgent.sub_riddle">sub_riddle</a></dd>
<dd id="MyGatekeeperAgent.get_extracted" class="function"><a href="../agent/agent.html#BasicAgent.get_extracted">get_extracted</a></dd>
</div>
<div><dt><a href="../agent/agent.html#GatekeeperAgent">ums.agent.agent.GatekeeperAgent</a></dt>

View File

@ -111,173 +111,173 @@
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">PERSIST_PATH</span><span class="p">,</span> <span class="s1">&#39;messages.db&#39;</span><span class="p">),</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">check_same_thread</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="n">autocommit</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">row_factory</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="k">lambda</span> <span class="n">db</span> <span class="p">:</span> <span class="n">db</span><span class="o">.</span><span class="n">close</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span> <span class="o">=</span> <span class="n">Lock</span><span class="p">()</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_assure_tables</span><span class="p">()</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="k">def</span> <span class="nf">_assure_tables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;CREATE TABLE IF NOT EXISTS Messages ( </span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a><span class="s2"> count INTEGER PRIMARY KEY AUTOINCREMENT,</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a><span class="s2"> id TEXT, </span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a><span class="s2"> sender TEXT,</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="s2"> recipient TEXT,</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="s2"> time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a><span class="s2"> json BLOB,</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a><span class="s2"> processed BOOL DEFAULT FALSE,</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a><span class="s2"> solution BOOL DEFAULT NULL</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a><span class="s2"> )&quot;&quot;&quot;</span><span class="p">)</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="nd">@validate_call</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="k">def</span> <span class="nf">add_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;INSERT INTO Messages (</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a><span class="sd"> id, sender, recipient, json, processed</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a><span class="sd"> ) VALUES (</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> :id, :sender, :recipient, :json, :processed</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="sd"> )&quot;&quot;&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="s2">&quot;id&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="s2">&quot;sender&quot;</span> <span class="p">:</span> <span class="n">sender</span><span class="p">,</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="s2">&quot;recipient&quot;</span> <span class="p">:</span> <span class="n">recipient</span><span class="p">,</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="s2">&quot;json&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="s2">&quot;processed&quot;</span> <span class="p">:</span> <span class="n">processed</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="p">})</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">new_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT LAST_INSERT_ROWID() as last&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="k">return</span> <span class="n">new_count</span><span class="p">[</span><span class="s1">&#39;last&#39;</span><span class="p">]</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="nd">@validate_call</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">def</span> <span class="nf">set_processed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET processed = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">processed</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="nd">@validate_call</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">def</span> <span class="nf">set_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET solution = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">yield from</span> <span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">()</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="nd">@validate_call</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="k">def</span> <span class="nf">iterate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_count_only</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="o">|</span><span class="nb">int</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">where</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="s2">&quot;lim&quot;</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="s2">&quot;off&quot;</span><span class="p">:</span> <span class="n">offset</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="p">}</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">)</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="p">):</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> = :</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="n">params</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="k">if</span> <span class="n">time_after</span><span class="p">:</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &gt; :t_after&quot;</span><span class="p">)</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_after&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_after</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">if</span> <span class="n">time_before</span><span class="p">:</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &lt; :t_before&quot;</span><span class="p">)</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_before&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_before</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">where</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;WHERE &quot;</span> <span class="o">+</span> <span class="p">(</span><span class="s1">&#39; AND &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">where</span><span class="p">))</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">if</span> <span class="n">_count_only</span><span class="p">:</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="s2">&quot;SELECT COUNT(*) as count FROM Messages </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="n">params</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">yield</span> <span class="n">count</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> <span class="s2">&quot;SELECT * FROM Messages </span><span class="si">{}</span><span class="s2"> ORDER BY time DESC, count DESC LIMIT :lim OFFSET :off&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="n">params</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="p">):</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">len</span><span class="p">()</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">def</span> <span class="nf">len</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a><span class="sd"> See `DB.iterate` for possible values of `kwargs`.</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;_count_only&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="k">def</span> <span class="nf">_create_row_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span><span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;json&#39;</span><span class="p">],</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;require_file_exists&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="n">allow_lazy</span><span class="p">}</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="p">)</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="k">if</span> <span class="n">allow_lazy</span><span class="p">:</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="p">(</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;error&quot;</span><span class="p">,</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="n">riddle</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;context&quot;</span><span class="p">:</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span><span class="s2">&quot;question&quot;</span><span class="p">:</span><span class="s2">&quot;Failed to load from Database!&quot;</span><span class="p">}</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="p">)</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="p">(</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">count</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">],</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="n">sender</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;sender&#39;</span><span class="p">],</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="n">recipient</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;recipient&#39;</span><span class="p">],</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="n">time</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()),</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="n">processed</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;processed&#39;</span><span class="p">],</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="n">solution</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;solution&#39;</span><span class="p">]</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="p">)</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="k">def</span> <span class="nf">by_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="o">|</span><span class="kc">None</span><span class="p">:</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT * FROM Messages WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">count</span><span class="p">,))</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="p">)</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">check_same_thread</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="p">)</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">row_factory</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="k">lambda</span> <span class="n">db</span> <span class="p">:</span> <span class="n">db</span><span class="o">.</span><span class="n">close</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span> <span class="o">=</span> <span class="n">Lock</span><span class="p">()</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_assure_tables</span><span class="p">()</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="k">def</span> <span class="nf">_assure_tables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;CREATE TABLE IF NOT EXISTS Messages ( </span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a><span class="s2"> count INTEGER PRIMARY KEY AUTOINCREMENT,</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a><span class="s2"> id TEXT, </span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a><span class="s2"> sender TEXT,</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a><span class="s2"> recipient TEXT,</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="s2"> time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="s2"> json BLOB,</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a><span class="s2"> processed BOOL DEFAULT FALSE,</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a><span class="s2"> solution BOOL DEFAULT NULL</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a><span class="s2"> )&quot;&quot;&quot;</span><span class="p">)</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="nd">@validate_call</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="k">def</span> <span class="nf">add_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;INSERT INTO Messages (</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a><span class="sd"> id, sender, recipient, json, processed</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a><span class="sd"> ) VALUES (</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a><span class="sd"> :id, :sender, :recipient, :json, :processed</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> )&quot;&quot;&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="s2">&quot;id&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="s2">&quot;sender&quot;</span> <span class="p">:</span> <span class="n">sender</span><span class="p">,</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="s2">&quot;recipient&quot;</span> <span class="p">:</span> <span class="n">recipient</span><span class="p">,</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="s2">&quot;json&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="s2">&quot;processed&quot;</span> <span class="p">:</span> <span class="n">processed</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="p">})</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">new_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT LAST_INSERT_ROWID() as last&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="k">return</span> <span class="n">new_count</span><span class="p">[</span><span class="s1">&#39;last&#39;</span><span class="p">]</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="nd">@validate_call</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="k">def</span> <span class="nf">set_processed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET processed = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">processed</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="nd">@validate_call</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="k">def</span> <span class="nf">set_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET solution = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">yield from</span> <span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">()</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="nd">@validate_call</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="k">def</span> <span class="nf">iterate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_count_only</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="o">|</span><span class="nb">int</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">where</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="s2">&quot;lim&quot;</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="s2">&quot;off&quot;</span><span class="p">:</span> <span class="n">offset</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="p">}</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">)</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="p">):</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> = :</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="n">params</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="k">if</span> <span class="n">time_after</span><span class="p">:</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &gt; :t_after&quot;</span><span class="p">)</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_after&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_after</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="n">time_before</span><span class="p">:</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &lt; :t_before&quot;</span><span class="p">)</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_before&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_before</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">where</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;WHERE &quot;</span> <span class="o">+</span> <span class="p">(</span><span class="s1">&#39; AND &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">where</span><span class="p">))</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">if</span> <span class="n">_count_only</span><span class="p">:</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="s2">&quot;SELECT COUNT(*) as count FROM Messages </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="n">params</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">yield</span> <span class="n">count</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="s2">&quot;SELECT * FROM Messages </span><span class="si">{}</span><span class="s2"> ORDER BY time DESC LIMIT :lim OFFSET :off&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> <span class="n">params</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="p">):</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">len</span><span class="p">()</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">def</span> <span class="nf">len</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a><span class="sd"> See `DB.iterate` for possible values of `kwargs`.</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;_count_only&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">def</span> <span class="nf">_create_row_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span><span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;json&#39;</span><span class="p">],</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;require_file_exists&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="n">allow_lazy</span><span class="p">}</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="p">)</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="k">if</span> <span class="n">allow_lazy</span><span class="p">:</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="p">(</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;error&quot;</span><span class="p">,</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="n">riddle</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;context&quot;</span><span class="p">:</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span><span class="s2">&quot;question&quot;</span><span class="p">:</span><span class="s2">&quot;Failed to load from Database!&quot;</span><span class="p">}</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="p">)</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="p">(</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="n">count</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">],</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">sender</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;sender&#39;</span><span class="p">],</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="n">recipient</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;recipient&#39;</span><span class="p">],</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="n">time</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()),</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="n">processed</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;processed&#39;</span><span class="p">],</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="n">solution</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;solution&#39;</span><span class="p">]</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="p">)</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="k">def</span> <span class="nf">by_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="o">|</span><span class="kc">None</span><span class="p">:</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT * FROM Messages WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">count</span><span class="p">,))</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="p">)</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a>
</span></pre></div>
@ -300,173 +300,172 @@
</span><span id="DB-27"><a href="#DB-27"><span class="linenos"> 27</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="DB-28"><a href="#DB-28"><span class="linenos"> 28</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span>
</span><span id="DB-29"><a href="#DB-29"><span class="linenos"> 29</span></a> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">PERSIST_PATH</span><span class="p">,</span> <span class="s1">&#39;messages.db&#39;</span><span class="p">),</span>
</span><span id="DB-30"><a href="#DB-30"><span class="linenos"> 30</span></a> <span class="n">check_same_thread</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="DB-31"><a href="#DB-31"><span class="linenos"> 31</span></a> <span class="n">autocommit</span><span class="o">=</span><span class="kc">False</span>
</span><span id="DB-32"><a href="#DB-32"><span class="linenos"> 32</span></a> <span class="p">)</span>
</span><span id="DB-33"><a href="#DB-33"><span class="linenos"> 33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">row_factory</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span>
</span><span id="DB-34"><a href="#DB-34"><span class="linenos"> 34</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="k">lambda</span> <span class="n">db</span> <span class="p">:</span> <span class="n">db</span><span class="o">.</span><span class="n">close</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="DB-35"><a href="#DB-35"><span class="linenos"> 35</span></a>
</span><span id="DB-36"><a href="#DB-36"><span class="linenos"> 36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span> <span class="o">=</span> <span class="n">Lock</span><span class="p">()</span>
</span><span id="DB-37"><a href="#DB-37"><span class="linenos"> 37</span></a>
</span><span id="DB-38"><a href="#DB-38"><span class="linenos"> 38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_assure_tables</span><span class="p">()</span>
</span><span id="DB-39"><a href="#DB-39"><span class="linenos"> 39</span></a>
</span><span id="DB-40"><a href="#DB-40"><span class="linenos"> 40</span></a> <span class="k">def</span> <span class="nf">_assure_tables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="DB-41"><a href="#DB-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-42"><a href="#DB-42"><span class="linenos"> 42</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-43"><a href="#DB-43"><span class="linenos"> 43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;CREATE TABLE IF NOT EXISTS Messages ( </span>
</span><span id="DB-44"><a href="#DB-44"><span class="linenos"> 44</span></a><span class="s2"> count INTEGER PRIMARY KEY AUTOINCREMENT,</span>
</span><span id="DB-45"><a href="#DB-45"><span class="linenos"> 45</span></a><span class="s2"> id TEXT, </span>
</span><span id="DB-46"><a href="#DB-46"><span class="linenos"> 46</span></a><span class="s2"> sender TEXT,</span>
</span><span id="DB-47"><a href="#DB-47"><span class="linenos"> 47</span></a><span class="s2"> recipient TEXT,</span>
</span><span id="DB-48"><a href="#DB-48"><span class="linenos"> 48</span></a><span class="s2"> time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,</span>
</span><span id="DB-49"><a href="#DB-49"><span class="linenos"> 49</span></a><span class="s2"> json BLOB,</span>
</span><span id="DB-50"><a href="#DB-50"><span class="linenos"> 50</span></a><span class="s2"> processed BOOL DEFAULT FALSE,</span>
</span><span id="DB-51"><a href="#DB-51"><span class="linenos"> 51</span></a><span class="s2"> solution BOOL DEFAULT NULL</span>
</span><span id="DB-52"><a href="#DB-52"><span class="linenos"> 52</span></a><span class="s2"> )&quot;&quot;&quot;</span><span class="p">)</span>
</span><span id="DB-53"><a href="#DB-53"><span class="linenos"> 53</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-54"><a href="#DB-54"><span class="linenos"> 54</span></a>
</span><span id="DB-55"><a href="#DB-55"><span class="linenos"> 55</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-56"><a href="#DB-56"><span class="linenos"> 56</span></a> <span class="k">def</span> <span class="nf">add_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB-57"><a href="#DB-57"><span class="linenos"> 57</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-58"><a href="#DB-58"><span class="linenos"> 58</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-59"><a href="#DB-59"><span class="linenos"> 59</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB-60"><a href="#DB-60"><span class="linenos"> 60</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;INSERT INTO Messages (</span>
</span><span id="DB-61"><a href="#DB-61"><span class="linenos"> 61</span></a><span class="sd"> id, sender, recipient, json, processed</span>
</span><span id="DB-62"><a href="#DB-62"><span class="linenos"> 62</span></a><span class="sd"> ) VALUES (</span>
</span><span id="DB-63"><a href="#DB-63"><span class="linenos"> 63</span></a><span class="sd"> :id, :sender, :recipient, :json, :processed</span>
</span><span id="DB-64"><a href="#DB-64"><span class="linenos"> 64</span></a><span class="sd"> )&quot;&quot;&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span id="DB-65"><a href="#DB-65"><span class="linenos"> 65</span></a> <span class="s2">&quot;id&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span><span id="DB-66"><a href="#DB-66"><span class="linenos"> 66</span></a> <span class="s2">&quot;sender&quot;</span> <span class="p">:</span> <span class="n">sender</span><span class="p">,</span>
</span><span id="DB-67"><a href="#DB-67"><span class="linenos"> 67</span></a> <span class="s2">&quot;recipient&quot;</span> <span class="p">:</span> <span class="n">recipient</span><span class="p">,</span>
</span><span id="DB-68"><a href="#DB-68"><span class="linenos"> 68</span></a> <span class="s2">&quot;json&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="DB-69"><a href="#DB-69"><span class="linenos"> 69</span></a> <span class="s2">&quot;processed&quot;</span> <span class="p">:</span> <span class="n">processed</span>
</span><span id="DB-70"><a href="#DB-70"><span class="linenos"> 70</span></a> <span class="p">})</span>
</span><span id="DB-71"><a href="#DB-71"><span class="linenos"> 71</span></a> <span class="n">new_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT LAST_INSERT_ROWID() as last&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB-72"><a href="#DB-72"><span class="linenos"> 72</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-73"><a href="#DB-73"><span class="linenos"> 73</span></a>
</span><span id="DB-74"><a href="#DB-74"><span class="linenos"> 74</span></a> <span class="k">return</span> <span class="n">new_count</span><span class="p">[</span><span class="s1">&#39;last&#39;</span><span class="p">]</span>
</span><span id="DB-75"><a href="#DB-75"><span class="linenos"> 75</span></a>
</span><span id="DB-76"><a href="#DB-76"><span class="linenos"> 76</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-77"><a href="#DB-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">set_processed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB-78"><a href="#DB-78"><span class="linenos"> 78</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-79"><a href="#DB-79"><span class="linenos"> 79</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-80"><a href="#DB-80"><span class="linenos"> 80</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-81"><a href="#DB-81"><span class="linenos"> 81</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET processed = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">processed</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB-82"><a href="#DB-82"><span class="linenos"> 82</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB-83"><a href="#DB-83"><span class="linenos"> 83</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB-84"><a href="#DB-84"><span class="linenos"> 84</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB-85"><a href="#DB-85"><span class="linenos"> 85</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB-86"><a href="#DB-86"><span class="linenos"> 86</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-87"><a href="#DB-87"><span class="linenos"> 87</span></a>
</span><span id="DB-88"><a href="#DB-88"><span class="linenos"> 88</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-89"><a href="#DB-89"><span class="linenos"> 89</span></a> <span class="k">def</span> <span class="nf">set_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB-90"><a href="#DB-90"><span class="linenos"> 90</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-91"><a href="#DB-91"><span class="linenos"> 91</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-92"><a href="#DB-92"><span class="linenos"> 92</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-93"><a href="#DB-93"><span class="linenos"> 93</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET solution = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB-94"><a href="#DB-94"><span class="linenos"> 94</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB-95"><a href="#DB-95"><span class="linenos"> 95</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB-96"><a href="#DB-96"><span class="linenos"> 96</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB-97"><a href="#DB-97"><span class="linenos"> 97</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB-98"><a href="#DB-98"><span class="linenos"> 98</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-99"><a href="#DB-99"><span class="linenos"> 99</span></a>
</span><span id="DB-100"><a href="#DB-100"><span class="linenos">100</span></a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="DB-101"><a href="#DB-101"><span class="linenos">101</span></a> <span class="k">yield from</span> <span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">()</span>
</span><span id="DB-102"><a href="#DB-102"><span class="linenos">102</span></a>
</span><span id="DB-103"><a href="#DB-103"><span class="linenos">103</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-104"><a href="#DB-104"><span class="linenos">104</span></a> <span class="k">def</span> <span class="nf">iterate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="DB-105"><a href="#DB-105"><span class="linenos">105</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB-106"><a href="#DB-106"><span class="linenos">106</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB-107"><a href="#DB-107"><span class="linenos">107</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB-108"><a href="#DB-108"><span class="linenos">108</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_count_only</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span>
</span><span id="DB-109"><a href="#DB-109"><span class="linenos">109</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="o">|</span><span class="nb">int</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="DB-110"><a href="#DB-110"><span class="linenos">110</span></a>
</span><span id="DB-111"><a href="#DB-111"><span class="linenos">111</span></a> <span class="n">where</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="DB-112"><a href="#DB-112"><span class="linenos">112</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="DB-113"><a href="#DB-113"><span class="linenos">113</span></a> <span class="s2">&quot;lim&quot;</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="DB-114"><a href="#DB-114"><span class="linenos">114</span></a> <span class="s2">&quot;off&quot;</span><span class="p">:</span> <span class="n">offset</span>
</span><span id="DB-115"><a href="#DB-115"><span class="linenos">115</span></a> <span class="p">}</span>
</span><span id="DB-116"><a href="#DB-116"><span class="linenos">116</span></a>
</span><span id="DB-117"><a href="#DB-117"><span class="linenos">117</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="DB-118"><a href="#DB-118"><span class="linenos">118</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span>
</span><span id="DB-119"><a href="#DB-119"><span class="linenos">119</span></a> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="DB-120"><a href="#DB-120"><span class="linenos">120</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">)</span>
</span><span id="DB-121"><a href="#DB-121"><span class="linenos">121</span></a> <span class="p">):</span>
</span><span id="DB-122"><a href="#DB-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="DB-123"><a href="#DB-123"><span class="linenos">123</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> = :</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span>
</span><span id="DB-124"><a href="#DB-124"><span class="linenos">124</span></a> <span class="n">params</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="DB-125"><a href="#DB-125"><span class="linenos">125</span></a>
</span><span id="DB-126"><a href="#DB-126"><span class="linenos">126</span></a> <span class="k">if</span> <span class="n">time_after</span><span class="p">:</span>
</span><span id="DB-127"><a href="#DB-127"><span class="linenos">127</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &gt; :t_after&quot;</span><span class="p">)</span>
</span><span id="DB-128"><a href="#DB-128"><span class="linenos">128</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_after&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_after</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB-129"><a href="#DB-129"><span class="linenos">129</span></a>
</span><span id="DB-130"><a href="#DB-130"><span class="linenos">130</span></a> <span class="k">if</span> <span class="n">time_before</span><span class="p">:</span>
</span><span id="DB-131"><a href="#DB-131"><span class="linenos">131</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &lt; :t_before&quot;</span><span class="p">)</span>
</span><span id="DB-132"><a href="#DB-132"><span class="linenos">132</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_before&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_before</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB-133"><a href="#DB-133"><span class="linenos">133</span></a>
</span><span id="DB-134"><a href="#DB-134"><span class="linenos">134</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">where</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="DB-135"><a href="#DB-135"><span class="linenos">135</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;WHERE &quot;</span> <span class="o">+</span> <span class="p">(</span><span class="s1">&#39; AND &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">where</span><span class="p">))</span>
</span><span id="DB-136"><a href="#DB-136"><span class="linenos">136</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB-137"><a href="#DB-137"><span class="linenos">137</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DB-138"><a href="#DB-138"><span class="linenos">138</span></a>
</span><span id="DB-139"><a href="#DB-139"><span class="linenos">139</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-140"><a href="#DB-140"><span class="linenos">140</span></a> <span class="k">if</span> <span class="n">_count_only</span><span class="p">:</span>
</span><span id="DB-141"><a href="#DB-141"><span class="linenos">141</span></a> <span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB-142"><a href="#DB-142"><span class="linenos">142</span></a> <span class="s2">&quot;SELECT COUNT(*) as count FROM Messages </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB-143"><a href="#DB-143"><span class="linenos">143</span></a> <span class="n">params</span>
</span><span id="DB-144"><a href="#DB-144"><span class="linenos">144</span></a> <span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB-145"><a href="#DB-145"><span class="linenos">145</span></a>
</span><span id="DB-146"><a href="#DB-146"><span class="linenos">146</span></a> <span class="k">yield</span> <span class="n">count</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
</span><span id="DB-147"><a href="#DB-147"><span class="linenos">147</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB-148"><a href="#DB-148"><span class="linenos">148</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB-149"><a href="#DB-149"><span class="linenos">149</span></a> <span class="s2">&quot;SELECT * FROM Messages </span><span class="si">{}</span><span class="s2"> ORDER BY time DESC, count DESC LIMIT :lim OFFSET :off&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB-150"><a href="#DB-150"><span class="linenos">150</span></a> <span class="n">params</span>
</span><span id="DB-151"><a href="#DB-151"><span class="linenos">151</span></a> <span class="p">):</span>
</span><span id="DB-152"><a href="#DB-152"><span class="linenos">152</span></a> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="DB-153"><a href="#DB-153"><span class="linenos">153</span></a>
</span><span id="DB-154"><a href="#DB-154"><span class="linenos">154</span></a> <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB-155"><a href="#DB-155"><span class="linenos">155</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">len</span><span class="p">()</span>
</span><span id="DB-156"><a href="#DB-156"><span class="linenos">156</span></a>
</span><span id="DB-157"><a href="#DB-157"><span class="linenos">157</span></a> <span class="k">def</span> <span class="nf">len</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB-158"><a href="#DB-158"><span class="linenos">158</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="DB-159"><a href="#DB-159"><span class="linenos">159</span></a><span class="sd"> See `DB.iterate` for possible values of `kwargs`.</span>
</span><span id="DB-160"><a href="#DB-160"><span class="linenos">160</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="DB-161"><a href="#DB-161"><span class="linenos">161</span></a> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;_count_only&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="DB-162"><a href="#DB-162"><span class="linenos">162</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
</span><span id="DB-163"><a href="#DB-163"><span class="linenos">163</span></a>
</span><span id="DB-164"><a href="#DB-164"><span class="linenos">164</span></a> <span class="k">def</span> <span class="nf">_create_row_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span><span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="DB-165"><a href="#DB-165"><span class="linenos">165</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-166"><a href="#DB-166"><span class="linenos">166</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span>
</span><span id="DB-167"><a href="#DB-167"><span class="linenos">167</span></a> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;json&#39;</span><span class="p">],</span>
</span><span id="DB-168"><a href="#DB-168"><span class="linenos">168</span></a> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;require_file_exists&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="n">allow_lazy</span><span class="p">}</span>
</span><span id="DB-169"><a href="#DB-169"><span class="linenos">169</span></a> <span class="p">)</span>
</span><span id="DB-170"><a href="#DB-170"><span class="linenos">170</span></a> <span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="DB-171"><a href="#DB-171"><span class="linenos">171</span></a> <span class="k">if</span> <span class="n">allow_lazy</span><span class="p">:</span>
</span><span id="DB-172"><a href="#DB-172"><span class="linenos">172</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="p">(</span>
</span><span id="DB-173"><a href="#DB-173"><span class="linenos">173</span></a> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;error&quot;</span><span class="p">,</span>
</span><span id="DB-174"><a href="#DB-174"><span class="linenos">174</span></a> <span class="n">riddle</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;context&quot;</span><span class="p">:</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span><span class="s2">&quot;question&quot;</span><span class="p">:</span><span class="s2">&quot;Failed to load from Database!&quot;</span><span class="p">}</span>
</span><span id="DB-175"><a href="#DB-175"><span class="linenos">175</span></a> <span class="p">)</span>
</span><span id="DB-176"><a href="#DB-176"><span class="linenos">176</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB-177"><a href="#DB-177"><span class="linenos">177</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="DB-178"><a href="#DB-178"><span class="linenos">178</span></a>
</span><span id="DB-179"><a href="#DB-179"><span class="linenos">179</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="p">(</span>
</span><span id="DB-180"><a href="#DB-180"><span class="linenos">180</span></a> <span class="n">count</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">],</span>
</span><span id="DB-181"><a href="#DB-181"><span class="linenos">181</span></a> <span class="n">sender</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;sender&#39;</span><span class="p">],</span>
</span><span id="DB-182"><a href="#DB-182"><span class="linenos">182</span></a> <span class="n">recipient</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;recipient&#39;</span><span class="p">],</span>
</span><span id="DB-183"><a href="#DB-183"><span class="linenos">183</span></a> <span class="n">time</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()),</span>
</span><span id="DB-184"><a href="#DB-184"><span class="linenos">184</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="DB-185"><a href="#DB-185"><span class="linenos">185</span></a> <span class="n">processed</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;processed&#39;</span><span class="p">],</span>
</span><span id="DB-186"><a href="#DB-186"><span class="linenos">186</span></a> <span class="n">solution</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;solution&#39;</span><span class="p">]</span>
</span><span id="DB-187"><a href="#DB-187"><span class="linenos">187</span></a> <span class="p">)</span>
</span><span id="DB-188"><a href="#DB-188"><span class="linenos">188</span></a>
</span><span id="DB-189"><a href="#DB-189"><span class="linenos">189</span></a> <span class="k">def</span> <span class="nf">by_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="o">|</span><span class="kc">None</span><span class="p">:</span>
</span><span id="DB-190"><a href="#DB-190"><span class="linenos">190</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-191"><a href="#DB-191"><span class="linenos">191</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-192"><a href="#DB-192"><span class="linenos">192</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span>
</span><span id="DB-193"><a href="#DB-193"><span class="linenos">193</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT * FROM Messages WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">count</span><span class="p">,))</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB-194"><a href="#DB-194"><span class="linenos">194</span></a> <span class="p">)</span>
</span><span id="DB-195"><a href="#DB-195"><span class="linenos">195</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB-196"><a href="#DB-196"><span class="linenos">196</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="DB-30"><a href="#DB-30"><span class="linenos"> 30</span></a> <span class="n">check_same_thread</span><span class="o">=</span><span class="kc">False</span>
</span><span id="DB-31"><a href="#DB-31"><span class="linenos"> 31</span></a> <span class="p">)</span>
</span><span id="DB-32"><a href="#DB-32"><span class="linenos"> 32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">row_factory</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span>
</span><span id="DB-33"><a href="#DB-33"><span class="linenos"> 33</span></a> <span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="k">lambda</span> <span class="n">db</span> <span class="p">:</span> <span class="n">db</span><span class="o">.</span><span class="n">close</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="DB-34"><a href="#DB-34"><span class="linenos"> 34</span></a>
</span><span id="DB-35"><a href="#DB-35"><span class="linenos"> 35</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span> <span class="o">=</span> <span class="n">Lock</span><span class="p">()</span>
</span><span id="DB-36"><a href="#DB-36"><span class="linenos"> 36</span></a>
</span><span id="DB-37"><a href="#DB-37"><span class="linenos"> 37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_assure_tables</span><span class="p">()</span>
</span><span id="DB-38"><a href="#DB-38"><span class="linenos"> 38</span></a>
</span><span id="DB-39"><a href="#DB-39"><span class="linenos"> 39</span></a> <span class="k">def</span> <span class="nf">_assure_tables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="DB-40"><a href="#DB-40"><span class="linenos"> 40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-41"><a href="#DB-41"><span class="linenos"> 41</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-42"><a href="#DB-42"><span class="linenos"> 42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;CREATE TABLE IF NOT EXISTS Messages ( </span>
</span><span id="DB-43"><a href="#DB-43"><span class="linenos"> 43</span></a><span class="s2"> count INTEGER PRIMARY KEY AUTOINCREMENT,</span>
</span><span id="DB-44"><a href="#DB-44"><span class="linenos"> 44</span></a><span class="s2"> id TEXT, </span>
</span><span id="DB-45"><a href="#DB-45"><span class="linenos"> 45</span></a><span class="s2"> sender TEXT,</span>
</span><span id="DB-46"><a href="#DB-46"><span class="linenos"> 46</span></a><span class="s2"> recipient TEXT,</span>
</span><span id="DB-47"><a href="#DB-47"><span class="linenos"> 47</span></a><span class="s2"> time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,</span>
</span><span id="DB-48"><a href="#DB-48"><span class="linenos"> 48</span></a><span class="s2"> json BLOB,</span>
</span><span id="DB-49"><a href="#DB-49"><span class="linenos"> 49</span></a><span class="s2"> processed BOOL DEFAULT FALSE,</span>
</span><span id="DB-50"><a href="#DB-50"><span class="linenos"> 50</span></a><span class="s2"> solution BOOL DEFAULT NULL</span>
</span><span id="DB-51"><a href="#DB-51"><span class="linenos"> 51</span></a><span class="s2"> )&quot;&quot;&quot;</span><span class="p">)</span>
</span><span id="DB-52"><a href="#DB-52"><span class="linenos"> 52</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-53"><a href="#DB-53"><span class="linenos"> 53</span></a>
</span><span id="DB-54"><a href="#DB-54"><span class="linenos"> 54</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-55"><a href="#DB-55"><span class="linenos"> 55</span></a> <span class="k">def</span> <span class="nf">add_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB-56"><a href="#DB-56"><span class="linenos"> 56</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-57"><a href="#DB-57"><span class="linenos"> 57</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-58"><a href="#DB-58"><span class="linenos"> 58</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB-59"><a href="#DB-59"><span class="linenos"> 59</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;INSERT INTO Messages (</span>
</span><span id="DB-60"><a href="#DB-60"><span class="linenos"> 60</span></a><span class="sd"> id, sender, recipient, json, processed</span>
</span><span id="DB-61"><a href="#DB-61"><span class="linenos"> 61</span></a><span class="sd"> ) VALUES (</span>
</span><span id="DB-62"><a href="#DB-62"><span class="linenos"> 62</span></a><span class="sd"> :id, :sender, :recipient, :json, :processed</span>
</span><span id="DB-63"><a href="#DB-63"><span class="linenos"> 63</span></a><span class="sd"> )&quot;&quot;&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span id="DB-64"><a href="#DB-64"><span class="linenos"> 64</span></a> <span class="s2">&quot;id&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span><span id="DB-65"><a href="#DB-65"><span class="linenos"> 65</span></a> <span class="s2">&quot;sender&quot;</span> <span class="p">:</span> <span class="n">sender</span><span class="p">,</span>
</span><span id="DB-66"><a href="#DB-66"><span class="linenos"> 66</span></a> <span class="s2">&quot;recipient&quot;</span> <span class="p">:</span> <span class="n">recipient</span><span class="p">,</span>
</span><span id="DB-67"><a href="#DB-67"><span class="linenos"> 67</span></a> <span class="s2">&quot;json&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="DB-68"><a href="#DB-68"><span class="linenos"> 68</span></a> <span class="s2">&quot;processed&quot;</span> <span class="p">:</span> <span class="n">processed</span>
</span><span id="DB-69"><a href="#DB-69"><span class="linenos"> 69</span></a> <span class="p">})</span>
</span><span id="DB-70"><a href="#DB-70"><span class="linenos"> 70</span></a> <span class="n">new_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT LAST_INSERT_ROWID() as last&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB-71"><a href="#DB-71"><span class="linenos"> 71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-72"><a href="#DB-72"><span class="linenos"> 72</span></a>
</span><span id="DB-73"><a href="#DB-73"><span class="linenos"> 73</span></a> <span class="k">return</span> <span class="n">new_count</span><span class="p">[</span><span class="s1">&#39;last&#39;</span><span class="p">]</span>
</span><span id="DB-74"><a href="#DB-74"><span class="linenos"> 74</span></a>
</span><span id="DB-75"><a href="#DB-75"><span class="linenos"> 75</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-76"><a href="#DB-76"><span class="linenos"> 76</span></a> <span class="k">def</span> <span class="nf">set_processed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB-77"><a href="#DB-77"><span class="linenos"> 77</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-78"><a href="#DB-78"><span class="linenos"> 78</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-79"><a href="#DB-79"><span class="linenos"> 79</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-80"><a href="#DB-80"><span class="linenos"> 80</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET processed = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">processed</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB-81"><a href="#DB-81"><span class="linenos"> 81</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB-82"><a href="#DB-82"><span class="linenos"> 82</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB-83"><a href="#DB-83"><span class="linenos"> 83</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB-84"><a href="#DB-84"><span class="linenos"> 84</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB-85"><a href="#DB-85"><span class="linenos"> 85</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-86"><a href="#DB-86"><span class="linenos"> 86</span></a>
</span><span id="DB-87"><a href="#DB-87"><span class="linenos"> 87</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-88"><a href="#DB-88"><span class="linenos"> 88</span></a> <span class="k">def</span> <span class="nf">set_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB-89"><a href="#DB-89"><span class="linenos"> 89</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB-90"><a href="#DB-90"><span class="linenos"> 90</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-91"><a href="#DB-91"><span class="linenos"> 91</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-92"><a href="#DB-92"><span class="linenos"> 92</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET solution = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB-93"><a href="#DB-93"><span class="linenos"> 93</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB-94"><a href="#DB-94"><span class="linenos"> 94</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB-95"><a href="#DB-95"><span class="linenos"> 95</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB-96"><a href="#DB-96"><span class="linenos"> 96</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB-97"><a href="#DB-97"><span class="linenos"> 97</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB-98"><a href="#DB-98"><span class="linenos"> 98</span></a>
</span><span id="DB-99"><a href="#DB-99"><span class="linenos"> 99</span></a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="DB-100"><a href="#DB-100"><span class="linenos">100</span></a> <span class="k">yield from</span> <span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">()</span>
</span><span id="DB-101"><a href="#DB-101"><span class="linenos">101</span></a>
</span><span id="DB-102"><a href="#DB-102"><span class="linenos">102</span></a> <span class="nd">@validate_call</span>
</span><span id="DB-103"><a href="#DB-103"><span class="linenos">103</span></a> <span class="k">def</span> <span class="nf">iterate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="DB-104"><a href="#DB-104"><span class="linenos">104</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB-105"><a href="#DB-105"><span class="linenos">105</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB-106"><a href="#DB-106"><span class="linenos">106</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB-107"><a href="#DB-107"><span class="linenos">107</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_count_only</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span>
</span><span id="DB-108"><a href="#DB-108"><span class="linenos">108</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="o">|</span><span class="nb">int</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="DB-109"><a href="#DB-109"><span class="linenos">109</span></a>
</span><span id="DB-110"><a href="#DB-110"><span class="linenos">110</span></a> <span class="n">where</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="DB-111"><a href="#DB-111"><span class="linenos">111</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="DB-112"><a href="#DB-112"><span class="linenos">112</span></a> <span class="s2">&quot;lim&quot;</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="DB-113"><a href="#DB-113"><span class="linenos">113</span></a> <span class="s2">&quot;off&quot;</span><span class="p">:</span> <span class="n">offset</span>
</span><span id="DB-114"><a href="#DB-114"><span class="linenos">114</span></a> <span class="p">}</span>
</span><span id="DB-115"><a href="#DB-115"><span class="linenos">115</span></a>
</span><span id="DB-116"><a href="#DB-116"><span class="linenos">116</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="DB-117"><a href="#DB-117"><span class="linenos">117</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span>
</span><span id="DB-118"><a href="#DB-118"><span class="linenos">118</span></a> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="DB-119"><a href="#DB-119"><span class="linenos">119</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">)</span>
</span><span id="DB-120"><a href="#DB-120"><span class="linenos">120</span></a> <span class="p">):</span>
</span><span id="DB-121"><a href="#DB-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="DB-122"><a href="#DB-122"><span class="linenos">122</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> = :</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span>
</span><span id="DB-123"><a href="#DB-123"><span class="linenos">123</span></a> <span class="n">params</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="DB-124"><a href="#DB-124"><span class="linenos">124</span></a>
</span><span id="DB-125"><a href="#DB-125"><span class="linenos">125</span></a> <span class="k">if</span> <span class="n">time_after</span><span class="p">:</span>
</span><span id="DB-126"><a href="#DB-126"><span class="linenos">126</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &gt; :t_after&quot;</span><span class="p">)</span>
</span><span id="DB-127"><a href="#DB-127"><span class="linenos">127</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_after&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_after</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB-128"><a href="#DB-128"><span class="linenos">128</span></a>
</span><span id="DB-129"><a href="#DB-129"><span class="linenos">129</span></a> <span class="k">if</span> <span class="n">time_before</span><span class="p">:</span>
</span><span id="DB-130"><a href="#DB-130"><span class="linenos">130</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &lt; :t_before&quot;</span><span class="p">)</span>
</span><span id="DB-131"><a href="#DB-131"><span class="linenos">131</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_before&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_before</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB-132"><a href="#DB-132"><span class="linenos">132</span></a>
</span><span id="DB-133"><a href="#DB-133"><span class="linenos">133</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">where</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="DB-134"><a href="#DB-134"><span class="linenos">134</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;WHERE &quot;</span> <span class="o">+</span> <span class="p">(</span><span class="s1">&#39; AND &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">where</span><span class="p">))</span>
</span><span id="DB-135"><a href="#DB-135"><span class="linenos">135</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB-136"><a href="#DB-136"><span class="linenos">136</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DB-137"><a href="#DB-137"><span class="linenos">137</span></a>
</span><span id="DB-138"><a href="#DB-138"><span class="linenos">138</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-139"><a href="#DB-139"><span class="linenos">139</span></a> <span class="k">if</span> <span class="n">_count_only</span><span class="p">:</span>
</span><span id="DB-140"><a href="#DB-140"><span class="linenos">140</span></a> <span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB-141"><a href="#DB-141"><span class="linenos">141</span></a> <span class="s2">&quot;SELECT COUNT(*) as count FROM Messages </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB-142"><a href="#DB-142"><span class="linenos">142</span></a> <span class="n">params</span>
</span><span id="DB-143"><a href="#DB-143"><span class="linenos">143</span></a> <span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB-144"><a href="#DB-144"><span class="linenos">144</span></a>
</span><span id="DB-145"><a href="#DB-145"><span class="linenos">145</span></a> <span class="k">yield</span> <span class="n">count</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
</span><span id="DB-146"><a href="#DB-146"><span class="linenos">146</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB-147"><a href="#DB-147"><span class="linenos">147</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB-148"><a href="#DB-148"><span class="linenos">148</span></a> <span class="s2">&quot;SELECT * FROM Messages </span><span class="si">{}</span><span class="s2"> ORDER BY time DESC LIMIT :lim OFFSET :off&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB-149"><a href="#DB-149"><span class="linenos">149</span></a> <span class="n">params</span>
</span><span id="DB-150"><a href="#DB-150"><span class="linenos">150</span></a> <span class="p">):</span>
</span><span id="DB-151"><a href="#DB-151"><span class="linenos">151</span></a> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="DB-152"><a href="#DB-152"><span class="linenos">152</span></a>
</span><span id="DB-153"><a href="#DB-153"><span class="linenos">153</span></a> <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB-154"><a href="#DB-154"><span class="linenos">154</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">len</span><span class="p">()</span>
</span><span id="DB-155"><a href="#DB-155"><span class="linenos">155</span></a>
</span><span id="DB-156"><a href="#DB-156"><span class="linenos">156</span></a> <span class="k">def</span> <span class="nf">len</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB-157"><a href="#DB-157"><span class="linenos">157</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="DB-158"><a href="#DB-158"><span class="linenos">158</span></a><span class="sd"> See `DB.iterate` for possible values of `kwargs`.</span>
</span><span id="DB-159"><a href="#DB-159"><span class="linenos">159</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="DB-160"><a href="#DB-160"><span class="linenos">160</span></a> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;_count_only&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="DB-161"><a href="#DB-161"><span class="linenos">161</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
</span><span id="DB-162"><a href="#DB-162"><span class="linenos">162</span></a>
</span><span id="DB-163"><a href="#DB-163"><span class="linenos">163</span></a> <span class="k">def</span> <span class="nf">_create_row_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span><span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="DB-164"><a href="#DB-164"><span class="linenos">164</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-165"><a href="#DB-165"><span class="linenos">165</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span>
</span><span id="DB-166"><a href="#DB-166"><span class="linenos">166</span></a> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;json&#39;</span><span class="p">],</span>
</span><span id="DB-167"><a href="#DB-167"><span class="linenos">167</span></a> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;require_file_exists&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="n">allow_lazy</span><span class="p">}</span>
</span><span id="DB-168"><a href="#DB-168"><span class="linenos">168</span></a> <span class="p">)</span>
</span><span id="DB-169"><a href="#DB-169"><span class="linenos">169</span></a> <span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="DB-170"><a href="#DB-170"><span class="linenos">170</span></a> <span class="k">if</span> <span class="n">allow_lazy</span><span class="p">:</span>
</span><span id="DB-171"><a href="#DB-171"><span class="linenos">171</span></a> <span class="n">message</span> <span class="o">=</span> <span class="n">AgentMessage</span><span class="p">(</span>
</span><span id="DB-172"><a href="#DB-172"><span class="linenos">172</span></a> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;error&quot;</span><span class="p">,</span>
</span><span id="DB-173"><a href="#DB-173"><span class="linenos">173</span></a> <span class="n">riddle</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;context&quot;</span><span class="p">:</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span><span class="s2">&quot;question&quot;</span><span class="p">:</span><span class="s2">&quot;Failed to load from Database!&quot;</span><span class="p">}</span>
</span><span id="DB-174"><a href="#DB-174"><span class="linenos">174</span></a> <span class="p">)</span>
</span><span id="DB-175"><a href="#DB-175"><span class="linenos">175</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB-176"><a href="#DB-176"><span class="linenos">176</span></a> <span class="k">raise</span> <span class="n">e</span>
</span><span id="DB-177"><a href="#DB-177"><span class="linenos">177</span></a>
</span><span id="DB-178"><a href="#DB-178"><span class="linenos">178</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="p">(</span>
</span><span id="DB-179"><a href="#DB-179"><span class="linenos">179</span></a> <span class="n">count</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">],</span>
</span><span id="DB-180"><a href="#DB-180"><span class="linenos">180</span></a> <span class="n">sender</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;sender&#39;</span><span class="p">],</span>
</span><span id="DB-181"><a href="#DB-181"><span class="linenos">181</span></a> <span class="n">recipient</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;recipient&#39;</span><span class="p">],</span>
</span><span id="DB-182"><a href="#DB-182"><span class="linenos">182</span></a> <span class="n">time</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;time&#39;</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()),</span>
</span><span id="DB-183"><a href="#DB-183"><span class="linenos">183</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="DB-184"><a href="#DB-184"><span class="linenos">184</span></a> <span class="n">processed</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;processed&#39;</span><span class="p">],</span>
</span><span id="DB-185"><a href="#DB-185"><span class="linenos">185</span></a> <span class="n">solution</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;solution&#39;</span><span class="p">]</span>
</span><span id="DB-186"><a href="#DB-186"><span class="linenos">186</span></a> <span class="p">)</span>
</span><span id="DB-187"><a href="#DB-187"><span class="linenos">187</span></a>
</span><span id="DB-188"><a href="#DB-188"><span class="linenos">188</span></a> <span class="k">def</span> <span class="nf">by_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="o">|</span><span class="kc">None</span><span class="p">:</span>
</span><span id="DB-189"><a href="#DB-189"><span class="linenos">189</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB-190"><a href="#DB-190"><span class="linenos">190</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB-191"><a href="#DB-191"><span class="linenos">191</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span>
</span><span id="DB-192"><a href="#DB-192"><span class="linenos">192</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT * FROM Messages WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">count</span><span class="p">,))</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB-193"><a href="#DB-193"><span class="linenos">193</span></a> <span class="p">)</span>
</span><span id="DB-194"><a href="#DB-194"><span class="linenos">194</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB-195"><a href="#DB-195"><span class="linenos">195</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
@ -506,26 +505,26 @@
</div>
<a class="headerlink" href="#DB.add_message"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.add_message-55"><a href="#DB.add_message-55"><span class="linenos">55</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.add_message-56"><a href="#DB.add_message-56"><span class="linenos">56</span></a> <span class="k">def</span> <span class="nf">add_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB.add_message-57"><a href="#DB.add_message-57"><span class="linenos">57</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB.add_message-58"><a href="#DB.add_message-58"><span class="linenos">58</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.add_message-59"><a href="#DB.add_message-59"><span class="linenos">59</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB.add_message-60"><a href="#DB.add_message-60"><span class="linenos">60</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;INSERT INTO Messages (</span>
</span><span id="DB.add_message-61"><a href="#DB.add_message-61"><span class="linenos">61</span></a><span class="sd"> id, sender, recipient, json, processed</span>
</span><span id="DB.add_message-62"><a href="#DB.add_message-62"><span class="linenos">62</span></a><span class="sd"> ) VALUES (</span>
</span><span id="DB.add_message-63"><a href="#DB.add_message-63"><span class="linenos">63</span></a><span class="sd"> :id, :sender, :recipient, :json, :processed</span>
</span><span id="DB.add_message-64"><a href="#DB.add_message-64"><span class="linenos">64</span></a><span class="sd"> )&quot;&quot;&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span id="DB.add_message-65"><a href="#DB.add_message-65"><span class="linenos">65</span></a> <span class="s2">&quot;id&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span><span id="DB.add_message-66"><a href="#DB.add_message-66"><span class="linenos">66</span></a> <span class="s2">&quot;sender&quot;</span> <span class="p">:</span> <span class="n">sender</span><span class="p">,</span>
</span><span id="DB.add_message-67"><a href="#DB.add_message-67"><span class="linenos">67</span></a> <span class="s2">&quot;recipient&quot;</span> <span class="p">:</span> <span class="n">recipient</span><span class="p">,</span>
</span><span id="DB.add_message-68"><a href="#DB.add_message-68"><span class="linenos">68</span></a> <span class="s2">&quot;json&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="DB.add_message-69"><a href="#DB.add_message-69"><span class="linenos">69</span></a> <span class="s2">&quot;processed&quot;</span> <span class="p">:</span> <span class="n">processed</span>
</span><span id="DB.add_message-70"><a href="#DB.add_message-70"><span class="linenos">70</span></a> <span class="p">})</span>
</span><span id="DB.add_message-71"><a href="#DB.add_message-71"><span class="linenos">71</span></a> <span class="n">new_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT LAST_INSERT_ROWID() as last&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB.add_message-72"><a href="#DB.add_message-72"><span class="linenos">72</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB.add_message-73"><a href="#DB.add_message-73"><span class="linenos">73</span></a>
</span><span id="DB.add_message-74"><a href="#DB.add_message-74"><span class="linenos">74</span></a> <span class="k">return</span> <span class="n">new_count</span><span class="p">[</span><span class="s1">&#39;last&#39;</span><span class="p">]</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.add_message-54"><a href="#DB.add_message-54"><span class="linenos">54</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.add_message-55"><a href="#DB.add_message-55"><span class="linenos">55</span></a> <span class="k">def</span> <span class="nf">add_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB.add_message-56"><a href="#DB.add_message-56"><span class="linenos">56</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB.add_message-57"><a href="#DB.add_message-57"><span class="linenos">57</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.add_message-58"><a href="#DB.add_message-58"><span class="linenos">58</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB.add_message-59"><a href="#DB.add_message-59"><span class="linenos">59</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;INSERT INTO Messages (</span>
</span><span id="DB.add_message-60"><a href="#DB.add_message-60"><span class="linenos">60</span></a><span class="sd"> id, sender, recipient, json, processed</span>
</span><span id="DB.add_message-61"><a href="#DB.add_message-61"><span class="linenos">61</span></a><span class="sd"> ) VALUES (</span>
</span><span id="DB.add_message-62"><a href="#DB.add_message-62"><span class="linenos">62</span></a><span class="sd"> :id, :sender, :recipient, :json, :processed</span>
</span><span id="DB.add_message-63"><a href="#DB.add_message-63"><span class="linenos">63</span></a><span class="sd"> )&quot;&quot;&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span id="DB.add_message-64"><a href="#DB.add_message-64"><span class="linenos">64</span></a> <span class="s2">&quot;id&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span><span id="DB.add_message-65"><a href="#DB.add_message-65"><span class="linenos">65</span></a> <span class="s2">&quot;sender&quot;</span> <span class="p">:</span> <span class="n">sender</span><span class="p">,</span>
</span><span id="DB.add_message-66"><a href="#DB.add_message-66"><span class="linenos">66</span></a> <span class="s2">&quot;recipient&quot;</span> <span class="p">:</span> <span class="n">recipient</span><span class="p">,</span>
</span><span id="DB.add_message-67"><a href="#DB.add_message-67"><span class="linenos">67</span></a> <span class="s2">&quot;json&quot;</span> <span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="DB.add_message-68"><a href="#DB.add_message-68"><span class="linenos">68</span></a> <span class="s2">&quot;processed&quot;</span> <span class="p">:</span> <span class="n">processed</span>
</span><span id="DB.add_message-69"><a href="#DB.add_message-69"><span class="linenos">69</span></a> <span class="p">})</span>
</span><span id="DB.add_message-70"><a href="#DB.add_message-70"><span class="linenos">70</span></a> <span class="n">new_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT LAST_INSERT_ROWID() as last&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB.add_message-71"><a href="#DB.add_message-71"><span class="linenos">71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span id="DB.add_message-72"><a href="#DB.add_message-72"><span class="linenos">72</span></a>
</span><span id="DB.add_message-73"><a href="#DB.add_message-73"><span class="linenos">73</span></a> <span class="k">return</span> <span class="n">new_count</span><span class="p">[</span><span class="s1">&#39;last&#39;</span><span class="p">]</span>
</span></pre></div>
@ -544,17 +543,17 @@
</div>
<a class="headerlink" href="#DB.set_processed"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.set_processed-76"><a href="#DB.set_processed-76"><span class="linenos">76</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.set_processed-77"><a href="#DB.set_processed-77"><span class="linenos">77</span></a> <span class="k">def</span> <span class="nf">set_processed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB.set_processed-78"><a href="#DB.set_processed-78"><span class="linenos">78</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB.set_processed-79"><a href="#DB.set_processed-79"><span class="linenos">79</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.set_processed-80"><a href="#DB.set_processed-80"><span class="linenos">80</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB.set_processed-81"><a href="#DB.set_processed-81"><span class="linenos">81</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET processed = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">processed</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB.set_processed-82"><a href="#DB.set_processed-82"><span class="linenos">82</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB.set_processed-83"><a href="#DB.set_processed-83"><span class="linenos">83</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB.set_processed-84"><a href="#DB.set_processed-84"><span class="linenos">84</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB.set_processed-85"><a href="#DB.set_processed-85"><span class="linenos">85</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB.set_processed-86"><a href="#DB.set_processed-86"><span class="linenos">86</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.set_processed-75"><a href="#DB.set_processed-75"><span class="linenos">75</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.set_processed-76"><a href="#DB.set_processed-76"><span class="linenos">76</span></a> <span class="k">def</span> <span class="nf">set_processed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB.set_processed-77"><a href="#DB.set_processed-77"><span class="linenos">77</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB.set_processed-78"><a href="#DB.set_processed-78"><span class="linenos">78</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.set_processed-79"><a href="#DB.set_processed-79"><span class="linenos">79</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB.set_processed-80"><a href="#DB.set_processed-80"><span class="linenos">80</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET processed = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">processed</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB.set_processed-81"><a href="#DB.set_processed-81"><span class="linenos">81</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB.set_processed-82"><a href="#DB.set_processed-82"><span class="linenos">82</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB.set_processed-83"><a href="#DB.set_processed-83"><span class="linenos">83</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB.set_processed-84"><a href="#DB.set_processed-84"><span class="linenos">84</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB.set_processed-85"><a href="#DB.set_processed-85"><span class="linenos">85</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span></pre></div>
@ -573,17 +572,17 @@
</div>
<a class="headerlink" href="#DB.set_solution"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.set_solution-88"><a href="#DB.set_solution-88"><span class="linenos">88</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.set_solution-89"><a href="#DB.set_solution-89"><span class="linenos">89</span></a> <span class="k">def</span> <span class="nf">set_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB.set_solution-90"><a href="#DB.set_solution-90"><span class="linenos">90</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB.set_solution-91"><a href="#DB.set_solution-91"><span class="linenos">91</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.set_solution-92"><a href="#DB.set_solution-92"><span class="linenos">92</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB.set_solution-93"><a href="#DB.set_solution-93"><span class="linenos">93</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET solution = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB.set_solution-94"><a href="#DB.set_solution-94"><span class="linenos">94</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB.set_solution-95"><a href="#DB.set_solution-95"><span class="linenos">95</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB.set_solution-96"><a href="#DB.set_solution-96"><span class="linenos">96</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB.set_solution-97"><a href="#DB.set_solution-97"><span class="linenos">97</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB.set_solution-98"><a href="#DB.set_solution-98"><span class="linenos">98</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.set_solution-87"><a href="#DB.set_solution-87"><span class="linenos">87</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.set_solution-88"><a href="#DB.set_solution-88"><span class="linenos">88</span></a> <span class="k">def</span> <span class="nf">set_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="DB.set_solution-89"><a href="#DB.set_solution-89"><span class="linenos">89</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
</span><span id="DB.set_solution-90"><a href="#DB.set_solution-90"><span class="linenos">90</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.set_solution-91"><a href="#DB.set_solution-91"><span class="linenos">91</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB.set_solution-92"><a href="#DB.set_solution-92"><span class="linenos">92</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;UPDATE Messages SET solution = ? WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span> <span class="n">count</span><span class="p">))</span>
</span><span id="DB.set_solution-93"><a href="#DB.set_solution-93"><span class="linenos">93</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="DB.set_solution-94"><a href="#DB.set_solution-94"><span class="linenos">94</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB.set_solution-95"><a href="#DB.set_solution-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="DB.set_solution-96"><a href="#DB.set_solution-96"><span class="linenos">96</span></a> <span class="k">finally</span><span class="p">:</span>
</span><span id="DB.set_solution-97"><a href="#DB.set_solution-97"><span class="linenos">97</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span></pre></div>
@ -602,56 +601,56 @@
</div>
<a class="headerlink" href="#DB.iterate"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.iterate-103"><a href="#DB.iterate-103"><span class="linenos">103</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.iterate-104"><a href="#DB.iterate-104"><span class="linenos">104</span></a> <span class="k">def</span> <span class="nf">iterate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="DB.iterate-105"><a href="#DB.iterate-105"><span class="linenos">105</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB.iterate-106"><a href="#DB.iterate-106"><span class="linenos">106</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB.iterate-107"><a href="#DB.iterate-107"><span class="linenos">107</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB.iterate-108"><a href="#DB.iterate-108"><span class="linenos">108</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_count_only</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span>
</span><span id="DB.iterate-109"><a href="#DB.iterate-109"><span class="linenos">109</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="o">|</span><span class="nb">int</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="DB.iterate-110"><a href="#DB.iterate-110"><span class="linenos">110</span></a>
</span><span id="DB.iterate-111"><a href="#DB.iterate-111"><span class="linenos">111</span></a> <span class="n">where</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="DB.iterate-112"><a href="#DB.iterate-112"><span class="linenos">112</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="DB.iterate-113"><a href="#DB.iterate-113"><span class="linenos">113</span></a> <span class="s2">&quot;lim&quot;</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="DB.iterate-114"><a href="#DB.iterate-114"><span class="linenos">114</span></a> <span class="s2">&quot;off&quot;</span><span class="p">:</span> <span class="n">offset</span>
</span><span id="DB.iterate-115"><a href="#DB.iterate-115"><span class="linenos">115</span></a> <span class="p">}</span>
</span><span id="DB.iterate-116"><a href="#DB.iterate-116"><span class="linenos">116</span></a>
</span><span id="DB.iterate-117"><a href="#DB.iterate-117"><span class="linenos">117</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="DB.iterate-118"><a href="#DB.iterate-118"><span class="linenos">118</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span>
</span><span id="DB.iterate-119"><a href="#DB.iterate-119"><span class="linenos">119</span></a> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="DB.iterate-120"><a href="#DB.iterate-120"><span class="linenos">120</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">)</span>
</span><span id="DB.iterate-121"><a href="#DB.iterate-121"><span class="linenos">121</span></a> <span class="p">):</span>
</span><span id="DB.iterate-122"><a href="#DB.iterate-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="DB.iterate-123"><a href="#DB.iterate-123"><span class="linenos">123</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> = :</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span>
</span><span id="DB.iterate-124"><a href="#DB.iterate-124"><span class="linenos">124</span></a> <span class="n">params</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="DB.iterate-125"><a href="#DB.iterate-125"><span class="linenos">125</span></a>
</span><span id="DB.iterate-126"><a href="#DB.iterate-126"><span class="linenos">126</span></a> <span class="k">if</span> <span class="n">time_after</span><span class="p">:</span>
</span><span id="DB.iterate-127"><a href="#DB.iterate-127"><span class="linenos">127</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &gt; :t_after&quot;</span><span class="p">)</span>
</span><span id="DB.iterate-128"><a href="#DB.iterate-128"><span class="linenos">128</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_after&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_after</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB.iterate-129"><a href="#DB.iterate-129"><span class="linenos">129</span></a>
</span><span id="DB.iterate-130"><a href="#DB.iterate-130"><span class="linenos">130</span></a> <span class="k">if</span> <span class="n">time_before</span><span class="p">:</span>
</span><span id="DB.iterate-131"><a href="#DB.iterate-131"><span class="linenos">131</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &lt; :t_before&quot;</span><span class="p">)</span>
</span><span id="DB.iterate-132"><a href="#DB.iterate-132"><span class="linenos">132</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_before&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_before</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB.iterate-133"><a href="#DB.iterate-133"><span class="linenos">133</span></a>
</span><span id="DB.iterate-134"><a href="#DB.iterate-134"><span class="linenos">134</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">where</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="DB.iterate-135"><a href="#DB.iterate-135"><span class="linenos">135</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;WHERE &quot;</span> <span class="o">+</span> <span class="p">(</span><span class="s1">&#39; AND &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">where</span><span class="p">))</span>
</span><span id="DB.iterate-136"><a href="#DB.iterate-136"><span class="linenos">136</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB.iterate-137"><a href="#DB.iterate-137"><span class="linenos">137</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DB.iterate-138"><a href="#DB.iterate-138"><span class="linenos">138</span></a>
</span><span id="DB.iterate-139"><a href="#DB.iterate-139"><span class="linenos">139</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.iterate-140"><a href="#DB.iterate-140"><span class="linenos">140</span></a> <span class="k">if</span> <span class="n">_count_only</span><span class="p">:</span>
</span><span id="DB.iterate-141"><a href="#DB.iterate-141"><span class="linenos">141</span></a> <span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB.iterate-142"><a href="#DB.iterate-142"><span class="linenos">142</span></a> <span class="s2">&quot;SELECT COUNT(*) as count FROM Messages </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB.iterate-143"><a href="#DB.iterate-143"><span class="linenos">143</span></a> <span class="n">params</span>
</span><span id="DB.iterate-144"><a href="#DB.iterate-144"><span class="linenos">144</span></a> <span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB.iterate-145"><a href="#DB.iterate-145"><span class="linenos">145</span></a>
</span><span id="DB.iterate-146"><a href="#DB.iterate-146"><span class="linenos">146</span></a> <span class="k">yield</span> <span class="n">count</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
</span><span id="DB.iterate-147"><a href="#DB.iterate-147"><span class="linenos">147</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB.iterate-148"><a href="#DB.iterate-148"><span class="linenos">148</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB.iterate-149"><a href="#DB.iterate-149"><span class="linenos">149</span></a> <span class="s2">&quot;SELECT * FROM Messages </span><span class="si">{}</span><span class="s2"> ORDER BY time DESC, count DESC LIMIT :lim OFFSET :off&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB.iterate-150"><a href="#DB.iterate-150"><span class="linenos">150</span></a> <span class="n">params</span>
</span><span id="DB.iterate-151"><a href="#DB.iterate-151"><span class="linenos">151</span></a> <span class="p">):</span>
</span><span id="DB.iterate-152"><a href="#DB.iterate-152"><span class="linenos">152</span></a> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.iterate-102"><a href="#DB.iterate-102"><span class="linenos">102</span></a> <span class="nd">@validate_call</span>
</span><span id="DB.iterate-103"><a href="#DB.iterate-103"><span class="linenos">103</span></a> <span class="k">def</span> <span class="nf">iterate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="DB.iterate-104"><a href="#DB.iterate-104"><span class="linenos">104</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB.iterate-105"><a href="#DB.iterate-105"><span class="linenos">105</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB.iterate-106"><a href="#DB.iterate-106"><span class="linenos">106</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="DB.iterate-107"><a href="#DB.iterate-107"><span class="linenos">107</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_count_only</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span>
</span><span id="DB.iterate-108"><a href="#DB.iterate-108"><span class="linenos">108</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="o">|</span><span class="nb">int</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
</span><span id="DB.iterate-109"><a href="#DB.iterate-109"><span class="linenos">109</span></a>
</span><span id="DB.iterate-110"><a href="#DB.iterate-110"><span class="linenos">110</span></a> <span class="n">where</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="DB.iterate-111"><a href="#DB.iterate-111"><span class="linenos">111</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="DB.iterate-112"><a href="#DB.iterate-112"><span class="linenos">112</span></a> <span class="s2">&quot;lim&quot;</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="DB.iterate-113"><a href="#DB.iterate-113"><span class="linenos">113</span></a> <span class="s2">&quot;off&quot;</span><span class="p">:</span> <span class="n">offset</span>
</span><span id="DB.iterate-114"><a href="#DB.iterate-114"><span class="linenos">114</span></a> <span class="p">}</span>
</span><span id="DB.iterate-115"><a href="#DB.iterate-115"><span class="linenos">115</span></a>
</span><span id="DB.iterate-116"><a href="#DB.iterate-116"><span class="linenos">116</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="DB.iterate-117"><a href="#DB.iterate-117"><span class="linenos">117</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span>
</span><span id="DB.iterate-118"><a href="#DB.iterate-118"><span class="linenos">118</span></a> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="DB.iterate-119"><a href="#DB.iterate-119"><span class="linenos">119</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">)</span>
</span><span id="DB.iterate-120"><a href="#DB.iterate-120"><span class="linenos">120</span></a> <span class="p">):</span>
</span><span id="DB.iterate-121"><a href="#DB.iterate-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="DB.iterate-122"><a href="#DB.iterate-122"><span class="linenos">122</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> = :</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span>
</span><span id="DB.iterate-123"><a href="#DB.iterate-123"><span class="linenos">123</span></a> <span class="n">params</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="DB.iterate-124"><a href="#DB.iterate-124"><span class="linenos">124</span></a>
</span><span id="DB.iterate-125"><a href="#DB.iterate-125"><span class="linenos">125</span></a> <span class="k">if</span> <span class="n">time_after</span><span class="p">:</span>
</span><span id="DB.iterate-126"><a href="#DB.iterate-126"><span class="linenos">126</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &gt; :t_after&quot;</span><span class="p">)</span>
</span><span id="DB.iterate-127"><a href="#DB.iterate-127"><span class="linenos">127</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_after&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_after</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB.iterate-128"><a href="#DB.iterate-128"><span class="linenos">128</span></a>
</span><span id="DB.iterate-129"><a href="#DB.iterate-129"><span class="linenos">129</span></a> <span class="k">if</span> <span class="n">time_before</span><span class="p">:</span>
</span><span id="DB.iterate-130"><a href="#DB.iterate-130"><span class="linenos">130</span></a> <span class="n">where</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;time &lt; :t_before&quot;</span><span class="p">)</span>
</span><span id="DB.iterate-131"><a href="#DB.iterate-131"><span class="linenos">131</span></a> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;t_before&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time_before</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_DB_TIME_FORMAT</span><span class="p">)</span>
</span><span id="DB.iterate-132"><a href="#DB.iterate-132"><span class="linenos">132</span></a>
</span><span id="DB.iterate-133"><a href="#DB.iterate-133"><span class="linenos">133</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">where</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="DB.iterate-134"><a href="#DB.iterate-134"><span class="linenos">134</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;WHERE &quot;</span> <span class="o">+</span> <span class="p">(</span><span class="s1">&#39; AND &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">where</span><span class="p">))</span>
</span><span id="DB.iterate-135"><a href="#DB.iterate-135"><span class="linenos">135</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB.iterate-136"><a href="#DB.iterate-136"><span class="linenos">136</span></a> <span class="n">where_clause</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="DB.iterate-137"><a href="#DB.iterate-137"><span class="linenos">137</span></a>
</span><span id="DB.iterate-138"><a href="#DB.iterate-138"><span class="linenos">138</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.iterate-139"><a href="#DB.iterate-139"><span class="linenos">139</span></a> <span class="k">if</span> <span class="n">_count_only</span><span class="p">:</span>
</span><span id="DB.iterate-140"><a href="#DB.iterate-140"><span class="linenos">140</span></a> <span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB.iterate-141"><a href="#DB.iterate-141"><span class="linenos">141</span></a> <span class="s2">&quot;SELECT COUNT(*) as count FROM Messages </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB.iterate-142"><a href="#DB.iterate-142"><span class="linenos">142</span></a> <span class="n">params</span>
</span><span id="DB.iterate-143"><a href="#DB.iterate-143"><span class="linenos">143</span></a> <span class="p">)</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB.iterate-144"><a href="#DB.iterate-144"><span class="linenos">144</span></a>
</span><span id="DB.iterate-145"><a href="#DB.iterate-145"><span class="linenos">145</span></a> <span class="k">yield</span> <span class="n">count</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
</span><span id="DB.iterate-146"><a href="#DB.iterate-146"><span class="linenos">146</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="DB.iterate-147"><a href="#DB.iterate-147"><span class="linenos">147</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span><span id="DB.iterate-148"><a href="#DB.iterate-148"><span class="linenos">148</span></a> <span class="s2">&quot;SELECT * FROM Messages </span><span class="si">{}</span><span class="s2"> ORDER BY time DESC LIMIT :lim OFFSET :off&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">where_clause</span><span class="p">),</span>
</span><span id="DB.iterate-149"><a href="#DB.iterate-149"><span class="linenos">149</span></a> <span class="n">params</span>
</span><span id="DB.iterate-150"><a href="#DB.iterate-150"><span class="linenos">150</span></a> <span class="p">):</span>
</span><span id="DB.iterate-151"><a href="#DB.iterate-151"><span class="linenos">151</span></a> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></pre></div>
@ -669,12 +668,12 @@
</div>
<a class="headerlink" href="#DB.len"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.len-157"><a href="#DB.len-157"><span class="linenos">157</span></a> <span class="k">def</span> <span class="nf">len</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB.len-158"><a href="#DB.len-158"><span class="linenos">158</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="DB.len-159"><a href="#DB.len-159"><span class="linenos">159</span></a><span class="sd"> See `DB.iterate` for possible values of `kwargs`.</span>
</span><span id="DB.len-160"><a href="#DB.len-160"><span class="linenos">160</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="DB.len-161"><a href="#DB.len-161"><span class="linenos">161</span></a> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;_count_only&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="DB.len-162"><a href="#DB.len-162"><span class="linenos">162</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.len-156"><a href="#DB.len-156"><span class="linenos">156</span></a> <span class="k">def</span> <span class="nf">len</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="DB.len-157"><a href="#DB.len-157"><span class="linenos">157</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="DB.len-158"><a href="#DB.len-158"><span class="linenos">158</span></a><span class="sd"> See `DB.iterate` for possible values of `kwargs`.</span>
</span><span id="DB.len-159"><a href="#DB.len-159"><span class="linenos">159</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="DB.len-160"><a href="#DB.len-160"><span class="linenos">160</span></a> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;_count_only&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="DB.len-161"><a href="#DB.len-161"><span class="linenos">161</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
</span></pre></div>
@ -694,14 +693,14 @@
</div>
<a class="headerlink" href="#DB.by_count"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.by_count-189"><a href="#DB.by_count-189"><span class="linenos">189</span></a> <span class="k">def</span> <span class="nf">by_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="o">|</span><span class="kc">None</span><span class="p">:</span>
</span><span id="DB.by_count-190"><a href="#DB.by_count-190"><span class="linenos">190</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.by_count-191"><a href="#DB.by_count-191"><span class="linenos">191</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB.by_count-192"><a href="#DB.by_count-192"><span class="linenos">192</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span>
</span><span id="DB.by_count-193"><a href="#DB.by_count-193"><span class="linenos">193</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT * FROM Messages WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">count</span><span class="p">,))</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB.by_count-194"><a href="#DB.by_count-194"><span class="linenos">194</span></a> <span class="p">)</span>
</span><span id="DB.by_count-195"><a href="#DB.by_count-195"><span class="linenos">195</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB.by_count-196"><a href="#DB.by_count-196"><span class="linenos">196</span></a> <span class="k">return</span> <span class="kc">None</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="DB.by_count-188"><a href="#DB.by_count-188"><span class="linenos">188</span></a> <span class="k">def</span> <span class="nf">by_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="o">|</span><span class="kc">None</span><span class="p">:</span>
</span><span id="DB.by_count-189"><a href="#DB.by_count-189"><span class="linenos">189</span></a> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
</span><span id="DB.by_count-190"><a href="#DB.by_count-190"><span class="linenos">190</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="DB.by_count-191"><a href="#DB.by_count-191"><span class="linenos">191</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_row_object</span><span class="p">(</span>
</span><span id="DB.by_count-192"><a href="#DB.by_count-192"><span class="linenos">192</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;SELECT * FROM Messages WHERE count = ?&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">count</span><span class="p">,))</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span><span id="DB.by_count-193"><a href="#DB.by_count-193"><span class="linenos">193</span></a> <span class="p">)</span>
</span><span id="DB.by_count-194"><a href="#DB.by_count-194"><span class="linenos">194</span></a> <span class="k">except</span><span class="p">:</span>
</span><span id="DB.by_count-195"><a href="#DB.by_count-195"><span class="linenos">195</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>

View File

@ -104,7 +104,7 @@
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">(</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="n">prefix</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_PREFIX</span><span class="p">,</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;gui&quot;</span><span class="p">]</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;app, gui&quot;</span><span class="p">]</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="p">)</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routes</span><span class="p">()</span>
@ -202,7 +202,7 @@
</span><span id="Interface-32"><a href="#Interface-32"><span class="linenos"> 32</span></a>
</span><span id="Interface-33"><a href="#Interface-33"><span class="linenos"> 33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">(</span>
</span><span id="Interface-34"><a href="#Interface-34"><span class="linenos"> 34</span></a> <span class="n">prefix</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_PREFIX</span><span class="p">,</span>
</span><span id="Interface-35"><a href="#Interface-35"><span class="linenos"> 35</span></a> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;gui&quot;</span><span class="p">]</span>
</span><span id="Interface-35"><a href="#Interface-35"><span class="linenos"> 35</span></a> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;app, gui&quot;</span><span class="p">]</span>
</span><span id="Interface-36"><a href="#Interface-36"><span class="linenos"> 36</span></a> <span class="p">)</span>
</span><span id="Interface-37"><a href="#Interface-37"><span class="linenos"> 37</span></a>
</span><span id="Interface-38"><a href="#Interface-38"><span class="linenos"> 38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routes</span><span class="p">()</span>
@ -296,7 +296,7 @@
</span><span id="Interface.__init__-32"><a href="#Interface.__init__-32"><span class="linenos">32</span></a>
</span><span id="Interface.__init__-33"><a href="#Interface.__init__-33"><span class="linenos">33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">(</span>
</span><span id="Interface.__init__-34"><a href="#Interface.__init__-34"><span class="linenos">34</span></a> <span class="n">prefix</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_PREFIX</span><span class="p">,</span>
</span><span id="Interface.__init__-35"><a href="#Interface.__init__-35"><span class="linenos">35</span></a> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;gui&quot;</span><span class="p">]</span>
</span><span id="Interface.__init__-35"><a href="#Interface.__init__-35"><span class="linenos">35</span></a> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;app, gui&quot;</span><span class="p">]</span>
</span><span id="Interface.__init__-36"><a href="#Interface.__init__-36"><span class="linenos">36</span></a> <span class="p">)</span>
</span><span id="Interface.__init__-37"><a href="#Interface.__init__-37"><span class="linenos">37</span></a>
</span><span id="Interface.__init__-38"><a href="#Interface.__init__-38"><span class="linenos">38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routes</span><span class="p">()</span>

View File

@ -77,119 +77,96 @@
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">import</span> <span class="nn">os</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span><span class="p">,</span> <span class="n">Request</span><span class="p">,</span> <span class="n">BackgroundTasks</span><span class="p">,</span> <span class="n">HTTPException</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">fastapi.responses</span> <span class="kn">import</span> <span class="n">HTMLResponse</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="kn">from</span> <span class="nn">fastapi.templating</span> <span class="kn">import</span> <span class="n">Jinja2Templates</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="kn">from</span> <span class="nn">jinja2.runtime</span> <span class="kn">import</span> <span class="n">Undefined</span> <span class="k">as</span> <span class="n">JinjaUndefined</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="kn">from</span> <span class="nn">ums.management.interface</span> <span class="kn">import</span> <span class="n">Interface</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="kn">from</span> <span class="nn">ums.management.db</span> <span class="kn">import</span> <span class="n">DB</span><span class="p">,</span> <span class="n">MessageDbRow</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="kn">from</span> <span class="nn">ums.management.process</span> <span class="kn">import</span> <span class="n">MessageProcessor</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="kn">from</span> <span class="nn">ums.utils</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">TEMPLATE_PATH</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="k">class</span> <span class="nc">WebMain</span><span class="p">():</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="n">_TIME_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;%H:%M:%S </span><span class="si">%d</span><span class="s2">.%m.%Y&quot;</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_app</span><span class="p">()</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_templates</span><span class="p">()</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">DB</span><span class="p">()</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span> <span class="o">=</span> <span class="n">MessageProcessor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routes</span><span class="p">()</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routers</span><span class="p">()</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span><span class="p">,</span> <span class="n">Request</span><span class="p">,</span> <span class="n">BackgroundTasks</span><span class="p">,</span> <span class="n">HTTPException</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="kn">from</span> <span class="nn">fastapi.responses</span> <span class="kn">import</span> <span class="n">HTMLResponse</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">fastapi.templating</span> <span class="kn">import</span> <span class="n">Jinja2Templates</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="kn">from</span> <span class="nn">jinja2.runtime</span> <span class="kn">import</span> <span class="n">Undefined</span> <span class="k">as</span> <span class="n">JinjaUndefined</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="kn">from</span> <span class="nn">ums.management.interface</span> <span class="kn">import</span> <span class="n">Interface</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="kn">from</span> <span class="nn">ums.management.db</span> <span class="kn">import</span> <span class="n">DB</span><span class="p">,</span> <span class="n">MessageDbRow</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="kn">from</span> <span class="nn">ums.management.process</span> <span class="kn">import</span> <span class="n">MessageProcessor</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="kn">from</span> <span class="nn">ums.utils</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">TEMPLATE_PATH</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="k">class</span> <span class="nc">WebMain</span><span class="p">():</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">_TIME_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;%H:%M:%S </span><span class="si">%d</span><span class="s2">.%m.%Y&quot;</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_app</span><span class="p">()</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_templates</span><span class="p">()</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">DB</span><span class="p">()</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span> <span class="o">=</span> <span class="n">MessageProcessor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routes</span><span class="p">()</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routers</span><span class="p">()</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="k">def</span> <span class="nf">_init_app</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">(</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform&quot;</span><span class="p">,</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="n">description</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform Management&quot;</span><span class="p">,</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="n">openapi_url</span><span class="o">=</span><span class="s2">&quot;/api/schema.json&quot;</span><span class="p">,</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="n">docs_url</span><span class="o">=</span><span class="s1">&#39;/api&#39;</span><span class="p">,</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="n">redoc_url</span><span class="o">=</span><span class="kc">None</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="p">)</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="k">def</span> <span class="nf">_init_templates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">=</span> <span class="n">Jinja2Templates</span><span class="p">(</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="n">directory</span><span class="o">=</span><span class="n">TEMPLATE_PATH</span><span class="p">,</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">True</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="p">)</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">def</span> <span class="nf">timestamp2date</span><span class="p">(</span><span class="n">t</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="k">else</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">t</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;timestamp2date&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestamp2date</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">def</span> <span class="nf">date2timestamp</span><span class="p">(</span><span class="n">d</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="o">|</span><span class="nb">str</span><span class="p">:</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="k">else</span> <span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">())</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;date2timestamp&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date2timestamp</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="k">def</span> <span class="nf">_init_app</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">(</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform&quot;</span><span class="p">,</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="n">description</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform Management&quot;</span><span class="p">,</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="n">openapi_url</span><span class="o">=</span><span class="s2">&quot;/api/schema.json&quot;</span><span class="p">,</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="n">docs_url</span><span class="o">=</span><span class="s1">&#39;/api&#39;</span><span class="p">,</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="n">redoc_url</span><span class="o">=</span><span class="kc">None</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="p">)</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">def</span> <span class="nf">_init_templates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">=</span> <span class="n">Jinja2Templates</span><span class="p">(</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="n">directory</span><span class="o">=</span><span class="n">TEMPLATE_PATH</span><span class="p">,</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">True</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">def</span> <span class="nf">timestamp2date</span><span class="p">(</span><span class="n">t</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="k">else</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">t</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;timestamp2date&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestamp2date</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="k">def</span> <span class="nf">date2timestamp</span><span class="p">(</span><span class="n">d</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="o">|</span><span class="nb">str</span><span class="p">:</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="k">else</span> <span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">())</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;date2timestamp&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date2timestamp</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="k">def</span> <span class="nf">_add_routers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">interface_router</span> <span class="o">=</span> <span class="n">Interface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">include_router</span><span class="p">(</span><span class="n">interface_router</span><span class="o">.</span><span class="n">router</span><span class="p">)</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="k">def</span> <span class="nf">_add_routes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/index&quot;</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">HTMLResponse</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Link list&quot;</span><span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">):</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">TemplateResponse</span><span class="p">(</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="s1">&#39;index.html&#39;</span><span class="p">,</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="p">{</span><span class="s2">&quot;request&quot;</span> <span class="p">:</span> <span class="n">request</span><span class="p">}</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="p">)</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/message&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Send a message to the management&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;agents&#39;</span><span class="p">])</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;host&#39;</span><span class="p">]</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">if</span> <span class="s1">&#39;:&#39;</span> <span class="ow">in</span> <span class="n">receiver</span><span class="p">:</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">receiver</span><span class="p">[:</span><span class="n">receiver</span><span class="o">.</span><span class="n">rindex</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)]</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">sender</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;x-forwarded-for&#39;</span><span class="p">]</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span><span class="o">.</span><span class="n">new_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">)</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/list&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Get list of messages (like table)&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;cli, agents&quot;</span><span class="p">])</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">def</span> <span class="nf">list</span><span class="p">(</span><span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">]:</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="k">def</span> <span class="nf">_add_routers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">interface_router</span> <span class="o">=</span> <span class="n">Interface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">include_router</span><span class="p">(</span><span class="n">interface_router</span><span class="o">.</span><span class="n">router</span><span class="p">)</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="k">def</span> <span class="nf">_add_routes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/index&quot;</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">HTMLResponse</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Link list&quot;</span><span class="p">)</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">):</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">TemplateResponse</span><span class="p">(</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="s1">&#39;index.html&#39;</span><span class="p">,</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="p">{</span><span class="s2">&quot;request&quot;</span> <span class="p">:</span> <span class="n">request</span><span class="p">}</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="p">)</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/message&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Send a message to the management&quot;</span><span class="p">)</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;host&#39;</span><span class="p">]</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">if</span> <span class="s1">&#39;:&#39;</span> <span class="ow">in</span> <span class="n">receiver</span><span class="p">:</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">receiver</span><span class="p">[:</span><span class="n">receiver</span><span class="o">.</span><span class="n">rindex</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)]</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">sender</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;x-forwarded-for&#39;</span><span class="p">]</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span><span class="o">.</span><span class="n">new_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">)</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/status&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Get status of a message&quot;</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">def</span> <span class="nf">status</span><span class="p">(</span><span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">404</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s2">&quot;Message not found&quot;</span><span class="p">)</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">return</span> <span class="n">msg</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="n">db_args</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="s2">&quot;limit&quot;</span> <span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="s2">&quot;offset&quot;</span> <span class="p">:</span> <span class="n">offset</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="p">}</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">),</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="p">(</span><span class="n">time_after</span><span class="p">,</span> <span class="s1">&#39;time_after&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">time_before</span><span class="p">,</span> <span class="s1">&#39;time_before&#39;</span><span class="p">)</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="p">):</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">db_args</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">db_args</span><span class="p">)]</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/list/single&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Get a single message&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;cli, agents&quot;</span><span class="p">])</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">def</span> <span class="nf">status</span><span class="p">(</span><span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">404</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s2">&quot;Message not found&quot;</span><span class="p">)</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">return</span> <span class="n">msg</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;ums.management.main&quot;</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SERVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span><span class="p">:</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">main</span> <span class="o">=</span> <span class="n">WebMain</span><span class="p">()</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">app</span> <span class="o">=</span> <span class="n">main</span><span class="o">.</span><span class="n">app</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;ums.management.main&quot;</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SERVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span><span class="p">:</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">main</span> <span class="o">=</span> <span class="n">WebMain</span><span class="p">()</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">app</span> <span class="o">=</span> <span class="n">main</span><span class="o">.</span><span class="n">app</span>
</span></pre></div>
@ -205,100 +182,78 @@
</div>
<a class="headerlink" href="#WebMain"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="WebMain-29"><a href="#WebMain-29"><span class="linenos"> 29</span></a><span class="k">class</span> <span class="nc">WebMain</span><span class="p">():</span>
</span><span id="WebMain-30"><a href="#WebMain-30"><span class="linenos"> 30</span></a>
</span><span id="WebMain-31"><a href="#WebMain-31"><span class="linenos"> 31</span></a> <span class="n">_TIME_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;%H:%M:%S </span><span class="si">%d</span><span class="s2">.%m.%Y&quot;</span>
</span><span id="WebMain-32"><a href="#WebMain-32"><span class="linenos"> 32</span></a>
</span><span id="WebMain-33"><a href="#WebMain-33"><span class="linenos"> 33</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-34"><a href="#WebMain-34"><span class="linenos"> 34</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_app</span><span class="p">()</span>
</span><span id="WebMain-35"><a href="#WebMain-35"><span class="linenos"> 35</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_templates</span><span class="p">()</span>
</span><span id="WebMain-36"><a href="#WebMain-36"><span class="linenos"> 36</span></a>
</span><span id="WebMain-37"><a href="#WebMain-37"><span class="linenos"> 37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">DB</span><span class="p">()</span>
</span><span id="WebMain-38"><a href="#WebMain-38"><span class="linenos"> 38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span> <span class="o">=</span> <span class="n">MessageProcessor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="WebMain-39"><a href="#WebMain-39"><span class="linenos"> 39</span></a>
</span><span id="WebMain-40"><a href="#WebMain-40"><span class="linenos"> 40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routes</span><span class="p">()</span>
</span><span id="WebMain-41"><a href="#WebMain-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routers</span><span class="p">()</span>
</span><span id="WebMain-42"><a href="#WebMain-42"><span class="linenos"> 42</span></a>
</span><span id="WebMain-43"><a href="#WebMain-43"><span class="linenos"> 43</span></a>
</span><span id="WebMain-44"><a href="#WebMain-44"><span class="linenos"> 44</span></a> <span class="k">def</span> <span class="nf">_init_app</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-45"><a href="#WebMain-45"><span class="linenos"> 45</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">(</span>
</span><span id="WebMain-46"><a href="#WebMain-46"><span class="linenos"> 46</span></a> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform&quot;</span><span class="p">,</span>
</span><span id="WebMain-47"><a href="#WebMain-47"><span class="linenos"> 47</span></a> <span class="n">description</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform Management&quot;</span><span class="p">,</span>
</span><span id="WebMain-48"><a href="#WebMain-48"><span class="linenos"> 48</span></a> <span class="n">openapi_url</span><span class="o">=</span><span class="s2">&quot;/api/schema.json&quot;</span><span class="p">,</span>
</span><span id="WebMain-49"><a href="#WebMain-49"><span class="linenos"> 49</span></a> <span class="n">docs_url</span><span class="o">=</span><span class="s1">&#39;/api&#39;</span><span class="p">,</span>
</span><span id="WebMain-50"><a href="#WebMain-50"><span class="linenos"> 50</span></a> <span class="n">redoc_url</span><span class="o">=</span><span class="kc">None</span>
</span><span id="WebMain-51"><a href="#WebMain-51"><span class="linenos"> 51</span></a> <span class="p">)</span>
</span><span id="WebMain-52"><a href="#WebMain-52"><span class="linenos"> 52</span></a>
</span><span id="WebMain-53"><a href="#WebMain-53"><span class="linenos"> 53</span></a> <span class="k">def</span> <span class="nf">_init_templates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-54"><a href="#WebMain-54"><span class="linenos"> 54</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">=</span> <span class="n">Jinja2Templates</span><span class="p">(</span>
</span><span id="WebMain-55"><a href="#WebMain-55"><span class="linenos"> 55</span></a> <span class="n">directory</span><span class="o">=</span><span class="n">TEMPLATE_PATH</span><span class="p">,</span>
</span><span id="WebMain-56"><a href="#WebMain-56"><span class="linenos"> 56</span></a> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">True</span>
</span><span id="WebMain-57"><a href="#WebMain-57"><span class="linenos"> 57</span></a> <span class="p">)</span>
</span><span id="WebMain-58"><a href="#WebMain-58"><span class="linenos"> 58</span></a>
</span><span id="WebMain-59"><a href="#WebMain-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">timestamp2date</span><span class="p">(</span><span class="n">t</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="WebMain-60"><a href="#WebMain-60"><span class="linenos"> 60</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="WebMain-61"><a href="#WebMain-61"><span class="linenos"> 61</span></a> <span class="k">else</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">t</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span>
</span><span id="WebMain-62"><a href="#WebMain-62"><span class="linenos"> 62</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;timestamp2date&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestamp2date</span>
</span><span id="WebMain-63"><a href="#WebMain-63"><span class="linenos"> 63</span></a>
</span><span id="WebMain-64"><a href="#WebMain-64"><span class="linenos"> 64</span></a> <span class="k">def</span> <span class="nf">date2timestamp</span><span class="p">(</span><span class="n">d</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="o">|</span><span class="nb">str</span><span class="p">:</span>
</span><span id="WebMain-65"><a href="#WebMain-65"><span class="linenos"> 65</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="WebMain-66"><a href="#WebMain-66"><span class="linenos"> 66</span></a> <span class="k">else</span> <span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">())</span>
</span><span id="WebMain-67"><a href="#WebMain-67"><span class="linenos"> 67</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;date2timestamp&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date2timestamp</span>
</span><span id="WebMain-68"><a href="#WebMain-68"><span class="linenos"> 68</span></a>
</span><span id="WebMain-69"><a href="#WebMain-69"><span class="linenos"> 69</span></a>
</span><span id="WebMain-70"><a href="#WebMain-70"><span class="linenos"> 70</span></a> <span class="k">def</span> <span class="nf">_add_routers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-71"><a href="#WebMain-71"><span class="linenos"> 71</span></a> <span class="n">interface_router</span> <span class="o">=</span> <span class="n">Interface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="WebMain-72"><a href="#WebMain-72"><span class="linenos"> 72</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">include_router</span><span class="p">(</span><span class="n">interface_router</span><span class="o">.</span><span class="n">router</span><span class="p">)</span>
</span><span id="WebMain-73"><a href="#WebMain-73"><span class="linenos"> 73</span></a>
</span><span id="WebMain-74"><a href="#WebMain-74"><span class="linenos"> 74</span></a> <span class="k">def</span> <span class="nf">_add_routes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-75"><a href="#WebMain-75"><span class="linenos"> 75</span></a>
</span><span id="WebMain-76"><a href="#WebMain-76"><span class="linenos"> 76</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/index&quot;</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">HTMLResponse</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Link list&quot;</span><span class="p">)</span>
</span><span id="WebMain-77"><a href="#WebMain-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">):</span>
</span><span id="WebMain-78"><a href="#WebMain-78"><span class="linenos"> 78</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">TemplateResponse</span><span class="p">(</span>
</span><span id="WebMain-79"><a href="#WebMain-79"><span class="linenos"> 79</span></a> <span class="s1">&#39;index.html&#39;</span><span class="p">,</span>
</span><span id="WebMain-80"><a href="#WebMain-80"><span class="linenos"> 80</span></a> <span class="p">{</span><span class="s2">&quot;request&quot;</span> <span class="p">:</span> <span class="n">request</span><span class="p">}</span>
</span><span id="WebMain-81"><a href="#WebMain-81"><span class="linenos"> 81</span></a> <span class="p">)</span>
</span><span id="WebMain-82"><a href="#WebMain-82"><span class="linenos"> 82</span></a>
</span><span id="WebMain-83"><a href="#WebMain-83"><span class="linenos"> 83</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/message&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Send a message to the management&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;agents&#39;</span><span class="p">])</span>
</span><span id="WebMain-84"><a href="#WebMain-84"><span class="linenos"> 84</span></a> <span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="WebMain-85"><a href="#WebMain-85"><span class="linenos"> 85</span></a>
</span><span id="WebMain-86"><a href="#WebMain-86"><span class="linenos"> 86</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;host&#39;</span><span class="p">]</span>
</span><span id="WebMain-87"><a href="#WebMain-87"><span class="linenos"> 87</span></a> <span class="k">if</span> <span class="s1">&#39;:&#39;</span> <span class="ow">in</span> <span class="n">receiver</span><span class="p">:</span>
</span><span id="WebMain-88"><a href="#WebMain-88"><span class="linenos"> 88</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">receiver</span><span class="p">[:</span><span class="n">receiver</span><span class="o">.</span><span class="n">rindex</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)]</span>
</span><span id="WebMain-89"><a href="#WebMain-89"><span class="linenos"> 89</span></a>
</span><span id="WebMain-90"><a href="#WebMain-90"><span class="linenos"> 90</span></a> <span class="n">sender</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;x-forwarded-for&#39;</span><span class="p">]</span>
</span><span id="WebMain-91"><a href="#WebMain-91"><span class="linenos"> 91</span></a>
</span><span id="WebMain-92"><a href="#WebMain-92"><span class="linenos"> 92</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span><span class="o">.</span><span class="n">new_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">)</span>
</span><span id="WebMain-93"><a href="#WebMain-93"><span class="linenos"> 93</span></a>
</span><span id="WebMain-94"><a href="#WebMain-94"><span class="linenos"> 94</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/list&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Get list of messages (like table)&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;cli, agents&quot;</span><span class="p">])</span>
</span><span id="WebMain-95"><a href="#WebMain-95"><span class="linenos"> 95</span></a> <span class="k">def</span> <span class="nf">list</span><span class="p">(</span><span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="WebMain-96"><a href="#WebMain-96"><span class="linenos"> 96</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="WebMain-97"><a href="#WebMain-97"><span class="linenos"> 97</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="WebMain-98"><a href="#WebMain-98"><span class="linenos"> 98</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span>
</span><span id="WebMain-99"><a href="#WebMain-99"><span class="linenos"> 99</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">]:</span>
</span><span id="WebMain-100"><a href="#WebMain-100"><span class="linenos">100</span></a>
</span><span id="WebMain-101"><a href="#WebMain-101"><span class="linenos">101</span></a> <span class="n">db_args</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="WebMain-102"><a href="#WebMain-102"><span class="linenos">102</span></a> <span class="s2">&quot;limit&quot;</span> <span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
</span><span id="WebMain-103"><a href="#WebMain-103"><span class="linenos">103</span></a> <span class="s2">&quot;offset&quot;</span> <span class="p">:</span> <span class="n">offset</span>
</span><span id="WebMain-104"><a href="#WebMain-104"><span class="linenos">104</span></a> <span class="p">}</span>
</span><span id="WebMain-105"><a href="#WebMain-105"><span class="linenos">105</span></a>
</span><span id="WebMain-106"><a href="#WebMain-106"><span class="linenos">106</span></a> <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">n</span> <span class="ow">in</span> <span class="p">(</span>
</span><span id="WebMain-107"><a href="#WebMain-107"><span class="linenos">107</span></a> <span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="s1">&#39;id&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span><span class="s1">&#39;sender&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">recipient</span><span class="p">,</span><span class="s1">&#39;recipient&#39;</span><span class="p">),</span>
</span><span id="WebMain-108"><a href="#WebMain-108"><span class="linenos">108</span></a> <span class="p">(</span><span class="n">processed</span><span class="p">,</span><span class="s1">&#39;processed&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">solution</span><span class="p">,</span><span class="s1">&#39;solution&#39;</span><span class="p">),</span>
</span><span id="WebMain-109"><a href="#WebMain-109"><span class="linenos">109</span></a> <span class="p">(</span><span class="n">time_after</span><span class="p">,</span> <span class="s1">&#39;time_after&#39;</span><span class="p">),</span> <span class="p">(</span><span class="n">time_before</span><span class="p">,</span> <span class="s1">&#39;time_before&#39;</span><span class="p">)</span>
</span><span id="WebMain-110"><a href="#WebMain-110"><span class="linenos">110</span></a> <span class="p">):</span>
</span><span id="WebMain-111"><a href="#WebMain-111"><span class="linenos">111</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="WebMain-112"><a href="#WebMain-112"><span class="linenos">112</span></a> <span class="n">db_args</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="WebMain-113"><a href="#WebMain-113"><span class="linenos">113</span></a>
</span><span id="WebMain-114"><a href="#WebMain-114"><span class="linenos">114</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span><span class="o">**</span><span class="n">db_args</span><span class="p">)]</span>
</span><span id="WebMain-115"><a href="#WebMain-115"><span class="linenos">115</span></a>
</span><span id="WebMain-116"><a href="#WebMain-116"><span class="linenos">116</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/list/single&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Get a single message&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;cli, agents&quot;</span><span class="p">])</span>
</span><span id="WebMain-117"><a href="#WebMain-117"><span class="linenos">117</span></a> <span class="k">def</span> <span class="nf">status</span><span class="p">(</span><span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="WebMain-118"><a href="#WebMain-118"><span class="linenos">118</span></a> <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="WebMain-119"><a href="#WebMain-119"><span class="linenos">119</span></a> <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="WebMain-120"><a href="#WebMain-120"><span class="linenos">120</span></a> <span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">404</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s2">&quot;Message not found&quot;</span><span class="p">)</span>
</span><span id="WebMain-121"><a href="#WebMain-121"><span class="linenos">121</span></a>
</span><span id="WebMain-122"><a href="#WebMain-122"><span class="linenos">122</span></a> <span class="k">return</span> <span class="n">msg</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="WebMain-28"><a href="#WebMain-28"><span class="linenos">28</span></a><span class="k">class</span> <span class="nc">WebMain</span><span class="p">():</span>
</span><span id="WebMain-29"><a href="#WebMain-29"><span class="linenos">29</span></a>
</span><span id="WebMain-30"><a href="#WebMain-30"><span class="linenos">30</span></a> <span class="n">_TIME_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;%H:%M:%S </span><span class="si">%d</span><span class="s2">.%m.%Y&quot;</span>
</span><span id="WebMain-31"><a href="#WebMain-31"><span class="linenos">31</span></a>
</span><span id="WebMain-32"><a href="#WebMain-32"><span class="linenos">32</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-33"><a href="#WebMain-33"><span class="linenos">33</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_app</span><span class="p">()</span>
</span><span id="WebMain-34"><a href="#WebMain-34"><span class="linenos">34</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_init_templates</span><span class="p">()</span>
</span><span id="WebMain-35"><a href="#WebMain-35"><span class="linenos">35</span></a>
</span><span id="WebMain-36"><a href="#WebMain-36"><span class="linenos">36</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">DB</span><span class="p">()</span>
</span><span id="WebMain-37"><a href="#WebMain-37"><span class="linenos">37</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span> <span class="o">=</span> <span class="n">MessageProcessor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="WebMain-38"><a href="#WebMain-38"><span class="linenos">38</span></a>
</span><span id="WebMain-39"><a href="#WebMain-39"><span class="linenos">39</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routes</span><span class="p">()</span>
</span><span id="WebMain-40"><a href="#WebMain-40"><span class="linenos">40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_add_routers</span><span class="p">()</span>
</span><span id="WebMain-41"><a href="#WebMain-41"><span class="linenos">41</span></a>
</span><span id="WebMain-42"><a href="#WebMain-42"><span class="linenos">42</span></a>
</span><span id="WebMain-43"><a href="#WebMain-43"><span class="linenos">43</span></a> <span class="k">def</span> <span class="nf">_init_app</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-44"><a href="#WebMain-44"><span class="linenos">44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">(</span>
</span><span id="WebMain-45"><a href="#WebMain-45"><span class="linenos">45</span></a> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform&quot;</span><span class="p">,</span>
</span><span id="WebMain-46"><a href="#WebMain-46"><span class="linenos">46</span></a> <span class="n">description</span><span class="o">=</span><span class="s2">&quot;Agenten Plattform Management&quot;</span><span class="p">,</span>
</span><span id="WebMain-47"><a href="#WebMain-47"><span class="linenos">47</span></a> <span class="n">openapi_url</span><span class="o">=</span><span class="s2">&quot;/api/schema.json&quot;</span><span class="p">,</span>
</span><span id="WebMain-48"><a href="#WebMain-48"><span class="linenos">48</span></a> <span class="n">docs_url</span><span class="o">=</span><span class="s1">&#39;/api&#39;</span><span class="p">,</span>
</span><span id="WebMain-49"><a href="#WebMain-49"><span class="linenos">49</span></a> <span class="n">redoc_url</span><span class="o">=</span><span class="kc">None</span>
</span><span id="WebMain-50"><a href="#WebMain-50"><span class="linenos">50</span></a> <span class="p">)</span>
</span><span id="WebMain-51"><a href="#WebMain-51"><span class="linenos">51</span></a>
</span><span id="WebMain-52"><a href="#WebMain-52"><span class="linenos">52</span></a> <span class="k">def</span> <span class="nf">_init_templates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-53"><a href="#WebMain-53"><span class="linenos">53</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">=</span> <span class="n">Jinja2Templates</span><span class="p">(</span>
</span><span id="WebMain-54"><a href="#WebMain-54"><span class="linenos">54</span></a> <span class="n">directory</span><span class="o">=</span><span class="n">TEMPLATE_PATH</span><span class="p">,</span>
</span><span id="WebMain-55"><a href="#WebMain-55"><span class="linenos">55</span></a> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">True</span>
</span><span id="WebMain-56"><a href="#WebMain-56"><span class="linenos">56</span></a> <span class="p">)</span>
</span><span id="WebMain-57"><a href="#WebMain-57"><span class="linenos">57</span></a>
</span><span id="WebMain-58"><a href="#WebMain-58"><span class="linenos">58</span></a> <span class="k">def</span> <span class="nf">timestamp2date</span><span class="p">(</span><span class="n">t</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="WebMain-59"><a href="#WebMain-59"><span class="linenos">59</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="WebMain-60"><a href="#WebMain-60"><span class="linenos">60</span></a> <span class="k">else</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">t</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span>
</span><span id="WebMain-61"><a href="#WebMain-61"><span class="linenos">61</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;timestamp2date&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestamp2date</span>
</span><span id="WebMain-62"><a href="#WebMain-62"><span class="linenos">62</span></a>
</span><span id="WebMain-63"><a href="#WebMain-63"><span class="linenos">63</span></a> <span class="k">def</span> <span class="nf">date2timestamp</span><span class="p">(</span><span class="n">d</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="n">JinjaUndefined</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="o">|</span><span class="nb">str</span><span class="p">:</span>
</span><span id="WebMain-64"><a href="#WebMain-64"><span class="linenos">64</span></a> <span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">JinjaUndefined</span><span class="p">)</span> \
</span><span id="WebMain-65"><a href="#WebMain-65"><span class="linenos">65</span></a> <span class="k">else</span> <span class="nb">int</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_TIME_FORMAT</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">())</span>
</span><span id="WebMain-66"><a href="#WebMain-66"><span class="linenos">66</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="s2">&quot;date2timestamp&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">date2timestamp</span>
</span><span id="WebMain-67"><a href="#WebMain-67"><span class="linenos">67</span></a>
</span><span id="WebMain-68"><a href="#WebMain-68"><span class="linenos">68</span></a>
</span><span id="WebMain-69"><a href="#WebMain-69"><span class="linenos">69</span></a> <span class="k">def</span> <span class="nf">_add_routers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-70"><a href="#WebMain-70"><span class="linenos">70</span></a> <span class="n">interface_router</span> <span class="o">=</span> <span class="n">Interface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
</span><span id="WebMain-71"><a href="#WebMain-71"><span class="linenos">71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">include_router</span><span class="p">(</span><span class="n">interface_router</span><span class="o">.</span><span class="n">router</span><span class="p">)</span>
</span><span id="WebMain-72"><a href="#WebMain-72"><span class="linenos">72</span></a>
</span><span id="WebMain-73"><a href="#WebMain-73"><span class="linenos">73</span></a> <span class="k">def</span> <span class="nf">_add_routes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="WebMain-74"><a href="#WebMain-74"><span class="linenos">74</span></a>
</span><span id="WebMain-75"><a href="#WebMain-75"><span class="linenos">75</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/index&quot;</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">HTMLResponse</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Link list&quot;</span><span class="p">)</span>
</span><span id="WebMain-76"><a href="#WebMain-76"><span class="linenos">76</span></a> <span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">):</span>
</span><span id="WebMain-77"><a href="#WebMain-77"><span class="linenos">77</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="o">.</span><span class="n">TemplateResponse</span><span class="p">(</span>
</span><span id="WebMain-78"><a href="#WebMain-78"><span class="linenos">78</span></a> <span class="s1">&#39;index.html&#39;</span><span class="p">,</span>
</span><span id="WebMain-79"><a href="#WebMain-79"><span class="linenos">79</span></a> <span class="p">{</span><span class="s2">&quot;request&quot;</span> <span class="p">:</span> <span class="n">request</span><span class="p">}</span>
</span><span id="WebMain-80"><a href="#WebMain-80"><span class="linenos">80</span></a> <span class="p">)</span>
</span><span id="WebMain-81"><a href="#WebMain-81"><span class="linenos">81</span></a>
</span><span id="WebMain-82"><a href="#WebMain-82"><span class="linenos">82</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/message&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Send a message to the management&quot;</span><span class="p">)</span>
</span><span id="WebMain-83"><a href="#WebMain-83"><span class="linenos">83</span></a> <span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="WebMain-84"><a href="#WebMain-84"><span class="linenos">84</span></a>
</span><span id="WebMain-85"><a href="#WebMain-85"><span class="linenos">85</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;host&#39;</span><span class="p">]</span>
</span><span id="WebMain-86"><a href="#WebMain-86"><span class="linenos">86</span></a> <span class="k">if</span> <span class="s1">&#39;:&#39;</span> <span class="ow">in</span> <span class="n">receiver</span><span class="p">:</span>
</span><span id="WebMain-87"><a href="#WebMain-87"><span class="linenos">87</span></a> <span class="n">receiver</span> <span class="o">=</span> <span class="n">receiver</span><span class="p">[:</span><span class="n">receiver</span><span class="o">.</span><span class="n">rindex</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)]</span>
</span><span id="WebMain-88"><a href="#WebMain-88"><span class="linenos">88</span></a>
</span><span id="WebMain-89"><a href="#WebMain-89"><span class="linenos">89</span></a> <span class="n">sender</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;x-forwarded-for&#39;</span><span class="p">]</span>
</span><span id="WebMain-90"><a href="#WebMain-90"><span class="linenos">90</span></a>
</span><span id="WebMain-91"><a href="#WebMain-91"><span class="linenos">91</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg_process</span><span class="o">.</span><span class="n">new_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">background_tasks</span><span class="p">)</span>
</span><span id="WebMain-92"><a href="#WebMain-92"><span class="linenos">92</span></a>
</span><span id="WebMain-93"><a href="#WebMain-93"><span class="linenos">93</span></a> <span class="nd">@self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/status&quot;</span><span class="p">,</span> <span class="n">summary</span><span class="o">=</span><span class="s2">&quot;Get status of a message&quot;</span><span class="p">)</span>
</span><span id="WebMain-94"><a href="#WebMain-94"><span class="linenos">94</span></a> <span class="k">def</span> <span class="nf">status</span><span class="p">(</span><span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="WebMain-95"><a href="#WebMain-95"><span class="linenos">95</span></a> <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="WebMain-96"><a href="#WebMain-96"><span class="linenos">96</span></a> <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="WebMain-97"><a href="#WebMain-97"><span class="linenos">97</span></a> <span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">404</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s2">&quot;Message not found&quot;</span><span class="p">)</span>
</span><span id="WebMain-98"><a href="#WebMain-98"><span class="linenos">98</span></a>
</span><span id="WebMain-99"><a href="#WebMain-99"><span class="linenos">99</span></a> <span class="k">return</span> <span class="n">msg</span>
</span></pre></div>

View File

@ -41,15 +41,6 @@
<li>
<a class="variable" href="#MessageProcessor.SOLUTION_MAX_TRIALS">SOLUTION_MAX_TRIALS</a>
</li>
<li>
<a class="variable" href="#MessageProcessor.MESSAGE_MAX_CONTACTS">MESSAGE_MAX_CONTACTS</a>
</li>
<li>
<a class="variable" href="#MessageProcessor.REQUIRE_FULL_EXTRACT">REQUIRE_FULL_EXTRACT</a>
</li>
<li>
<a class="variable" href="#MessageProcessor.REQUIRE_FULL_SOLVE">REQUIRE_FULL_SOLVE</a>
</li>
<li>
<a class="variable" href="#MessageProcessor.MANAGEMENT_URL">MANAGEMENT_URL</a>
</li>
@ -112,257 +103,154 @@
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">BackgroundTasks</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">ums.management.db</span> <span class="kn">import</span> <span class="n">DB</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="kn">from</span> <span class="nn">ums.utils</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">RiddleData</span><span class="p">,</span> <span class="n">RiddleSolution</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="kn">from</span> <span class="nn">ums.utils</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">logger</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="k">class</span> <span class="nc">MessageProcessor</span><span class="p">():</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a> <span class="n">SOLUTION_MAX_TRIALS</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SOLUTION_MAX_TRIALS&#39;</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a> <span class="n">MESSAGE_MAX_CONTACTS</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MESSAGE_MAX_CONTACTS&#39;</span><span class="p">,</span> <span class="mi">100</span><span class="p">))</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a> <span class="n">REQUIRE_FULL_EXTRACT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;REQUIRE_FULL_EXTRACT&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="n">REQUIRE_FULL_SOLVE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;REQUIRE_FULL_SOLVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="n">AGENTS_PROCESS</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="n">AGENTS_PROCESS</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_PROCESS&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="p">))</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="n">AGENTS_SOLVE</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_PROCESS&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_SOLVE&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="p">))</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="n">AGENTS_SOLVE</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="n">AGENTS_GATEKEEPER</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_SOLVE&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_GATEKEEPER&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="p">))</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="n">AGENTS_GATEKEEPER</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_GATEKEEPER&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="p">))</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">:</span><span class="n">DB</span><span class="p">):</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">management_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">)</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">:</span><span class="n">DB</span><span class="p">):</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">management_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">)</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Process Agent (AGENTS_PROCESS) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Solve Agent (AGENTS_SOLVE) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Gatekeeper Agent (AGENTS_GATEKEEPER) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Process Agent (AGENTS_PROCESS) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Solve Agent (AGENTS_SOLVE) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Gatekeeper Agent (AGENTS_GATEKEEPER) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="k">def</span> <span class="nf">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">:</span><span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^https?://([^:]*)(?::(\d+))?$&#39;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="k">return</span> <span class="s2">&quot;unknown&quot;</span> <span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="k">def</span> <span class="nf">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">:</span><span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^https?://([^:]*)(?::(\d+))?$&#39;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="k">return</span> <span class="s2">&quot;unknown&quot;</span> <span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">receiver</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">receiver</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_process_message</span><span class="p">,</span> <span class="n">db_count</span><span class="p">)</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_process_message</span><span class="p">,</span> <span class="n">db_count</span><span class="p">)</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="n">count</span><span class="o">=</span><span class="n">db_count</span><span class="p">,</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added message to queue&quot;</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="p">)</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="p">)</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">def</span> <span class="nf">_process_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">ignore_processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">db_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">count</span><span class="o">=</span><span class="n">db_count</span><span class="p">,</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added message to queue&quot;</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="p">)</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="p">)</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="k">def</span> <span class="nf">_process_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">ignore_processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="n">db_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">processed</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ignore_processed</span><span class="p">:</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="c1"># do not process processed messages again</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">return</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">processed</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ignore_processed</span><span class="p">:</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="c1"># do not process processed messages again</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">return</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="c1"># now message processed!</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="c1"># increment contacts counter</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">contacts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">contacts</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">MESSAGE_MAX_CONTACTS</span><span class="p">:</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Message reached max number of contacts! </span><span class="si">{</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="k">return</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="c1"># check which step/ state the message requires the management to do</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="c1"># send to extract agents</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">elif</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">elif</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="c1"># check which step/ state the message requires the management to do</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="c1"># -&gt; IF</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="c1"># send to extract agents</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">return</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="c1"># combine different extractions in data items</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="c1"># will update items in `db_message.message.data`</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="n">fully_extracted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_extractions</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">REQUIRE_FULL_EXTRACT</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">fully_extracted</span><span class="p">:</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Postpone message, wait for full extract of items! </span><span class="si">{</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="k">return</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="c1"># -&gt; EL IF</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="k">return</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="c1"># combine different solutions</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="c1"># will add solutions received before to `db_message.message.solution`</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="n">fully_solved</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_solutions</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">solution</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span><span class="p">)</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">REQUIRE_FULL_SOLVE</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">fully_solved</span><span class="p">:</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Postpone message, wait for all solutions of riddle! </span><span class="si">{</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="k">return</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="c1"># -&gt; EL IF </span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="c1"># send to solve agents</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="k">return</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="c1"># -&gt; ELSE</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="c1"># all steps &quot;done&quot;</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="c1"># validate not required? (then solved will never be set to true, thus set it here)</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span><span class="p">:</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="c1"># yay, message is solved</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">True</span><span class="p">);</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="c1"># not solved, but all steps done</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">False</span><span class="p">);</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="c1"># try again</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_do_again</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">def</span> <span class="nf">_hash_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">:</span><span class="n">RiddleSolution</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="n">s</span><span class="o">.</span><span class="n">solution</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">explanation</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">((</span><span class="n">d</span><span class="o">.</span><span class="n">file_plain</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">s</span><span class="o">.</span><span class="n">used_data</span><span class="p">)))</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="k">def</span> <span class="nf">_add_solutions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle_id</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">RiddleSolution</span><span class="p">],</span> <span class="n">trial</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> <span class="c1"># do not do anything, if all solutions available</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">):</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="n">contained</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_solution</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">solution</span><span class="p">)</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="c1"># search db for solutions from before </span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">,</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="n">limit</span><span class="o">=</span><span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">len</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">),</span> <span class="mi">250</span><span class="p">)</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="p">):</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="c1"># make sure to only use solutions from same &quot;trial&quot;</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="k">if</span> <span class="n">row</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">==</span> <span class="n">trial</span><span class="p">:</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">row</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">solution</span><span class="p">:</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_solution</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="k">if</span> <span class="n">h</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">contained</span><span class="p">:</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="c1"># add the &#39;new&#39; solution</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">contained</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="c1"># all solutions found ?</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">):</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="k">break</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="k">def</span> <span class="nf">_hash_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span><span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="n">d</span><span class="o">.</span><span class="n">file_plain</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">prompt</span><span class="p">))</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">def</span> <span class="nf">_add_extractions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle_id</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">RiddleData</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="c1"># get all the data items without extraction</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">empty_data</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="k">if</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="n">empty_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)]</span> <span class="o">=</span> <span class="n">i</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="c1"># do not do anything if fully extracted</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">empty_data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="c1"># search db for extractions already available</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">,</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="n">limit</span><span class="o">=</span><span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">len</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">),</span> <span class="mi">250</span><span class="p">)</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="p">):</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="c1"># check for required extraction</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">row</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="c1"># already extracted ? </span>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="c1"># extraction file exists ?</span>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="c1"># one of the items, we do not have extractions for ?</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="c1"># the same data item ?</span>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span> <span class="ow">is</span> <span class="kc">None</span> \
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;missing:&quot;</span><span class="p">)</span> \
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="ow">in</span> <span class="n">empty_data</span><span class="p">:</span>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a> <span class="c1"># copy the reference to the extracted data</span>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a> <span class="n">data</span><span class="p">[</span><span class="n">empty_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)]]</span><span class="o">.</span><span class="n">file_extracted</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a> <span class="c1"># remove from items we need extracted data for</span>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a> <span class="k">del</span> <span class="n">empty_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)]</span>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="c1"># break if all extractions found</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">empty_data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="k">break</span>
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">empty_data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="c1"># fully extracted</span>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="k">def</span> <span class="nf">_do_again</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">):</span>
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">SOLUTION_MAX_TRIALS</span><span class="p">:</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="c1"># try again, recycle message</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="c1"># require steps again</span>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="c1"># increment trial</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="c1"># append current solution(s) als old one(s)</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="n">message</span><span class="o">.</span><span class="n">riddle</span><span class="o">.</span><span class="n">solutions_before</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="p">)</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="c1"># reset current solution</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a> <span class="c1"># add the riddle as new to management</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsolved riddle after max number of trials: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="k">def</span> <span class="nf">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipients</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">recipients</span><span class="p">:</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="n">ok</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="k">return</span> <span class="n">ok</span>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="n">sender</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">management_name</span><span class="p">,</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="n">recipient</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="n">processed</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="p">)</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="p">)</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">db_count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to: </span><span class="si">{</span><span class="n">recipient</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">else</span><span class="p">:</span> <span class="c1"># all steps &quot;done&quot;</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="c1"># validate not required? (then solved will never be set to true, thus set it here)</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span><span class="p">:</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="c1"># yay, message is solved</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">True</span><span class="p">);</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="c1"># not solved, but all steps done</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">False</span><span class="p">);</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="c1"># try again</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_do_again</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="c1"># now message processed!</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="k">def</span> <span class="nf">_do_again</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">):</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">SOLUTION_MAX_TRIALS</span><span class="p">:</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="c1"># try again, recycle message</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="c1"># require steps again</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="c1"># increment trial</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="c1"># append current solution als old one</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">solution</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="n">message</span><span class="o">.</span><span class="n">riddle</span><span class="o">.</span><span class="n">solutions_before</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="p">)</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="c1"># reset current solution</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="c1"># add the riddle as new to management</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">def</span> <span class="nf">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipients</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">recipients</span><span class="p">:</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="n">ok</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">return</span> <span class="n">ok</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="n">sender</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">management_name</span><span class="p">,</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> <span class="n">recipient</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="n">processed</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="p">)</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="p">)</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">db_count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to: </span><span class="si">{</span><span class="n">recipient</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a>
</span></pre></div>
@ -381,251 +269,148 @@
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor-21"><a href="#MessageProcessor-21"><span class="linenos"> 21</span></a><span class="k">class</span> <span class="nc">MessageProcessor</span><span class="p">():</span>
</span><span id="MessageProcessor-22"><a href="#MessageProcessor-22"><span class="linenos"> 22</span></a>
</span><span id="MessageProcessor-23"><a href="#MessageProcessor-23"><span class="linenos"> 23</span></a> <span class="n">SOLUTION_MAX_TRIALS</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SOLUTION_MAX_TRIALS&#39;</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span>
</span><span id="MessageProcessor-24"><a href="#MessageProcessor-24"><span class="linenos"> 24</span></a> <span class="n">MESSAGE_MAX_CONTACTS</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MESSAGE_MAX_CONTACTS&#39;</span><span class="p">,</span> <span class="mi">100</span><span class="p">))</span>
</span><span id="MessageProcessor-25"><a href="#MessageProcessor-25"><span class="linenos"> 25</span></a>
</span><span id="MessageProcessor-26"><a href="#MessageProcessor-26"><span class="linenos"> 26</span></a> <span class="n">REQUIRE_FULL_EXTRACT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;REQUIRE_FULL_EXTRACT&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span>
</span><span id="MessageProcessor-27"><a href="#MessageProcessor-27"><span class="linenos"> 27</span></a> <span class="n">REQUIRE_FULL_SOLVE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;REQUIRE_FULL_SOLVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span>
</span><span id="MessageProcessor-28"><a href="#MessageProcessor-28"><span class="linenos"> 28</span></a>
</span><span id="MessageProcessor-29"><a href="#MessageProcessor-29"><span class="linenos"> 29</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-30"><a href="#MessageProcessor-30"><span class="linenos"> 30</span></a>
</span><span id="MessageProcessor-31"><a href="#MessageProcessor-31"><span class="linenos"> 31</span></a> <span class="n">AGENTS_PROCESS</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="MessageProcessor-24"><a href="#MessageProcessor-24"><span class="linenos"> 24</span></a>
</span><span id="MessageProcessor-25"><a href="#MessageProcessor-25"><span class="linenos"> 25</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-26"><a href="#MessageProcessor-26"><span class="linenos"> 26</span></a>
</span><span id="MessageProcessor-27"><a href="#MessageProcessor-27"><span class="linenos"> 27</span></a> <span class="n">AGENTS_PROCESS</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="MessageProcessor-28"><a href="#MessageProcessor-28"><span class="linenos"> 28</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="MessageProcessor-29"><a href="#MessageProcessor-29"><span class="linenos"> 29</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_PROCESS&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-30"><a href="#MessageProcessor-30"><span class="linenos"> 30</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-31"><a href="#MessageProcessor-31"><span class="linenos"> 31</span></a> <span class="n">AGENTS_SOLVE</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="MessageProcessor-32"><a href="#MessageProcessor-32"><span class="linenos"> 32</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="MessageProcessor-33"><a href="#MessageProcessor-33"><span class="linenos"> 33</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_PROCESS&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-33"><a href="#MessageProcessor-33"><span class="linenos"> 33</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_SOLVE&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-34"><a href="#MessageProcessor-34"><span class="linenos"> 34</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-35"><a href="#MessageProcessor-35"><span class="linenos"> 35</span></a> <span class="n">AGENTS_SOLVE</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="MessageProcessor-35"><a href="#MessageProcessor-35"><span class="linenos"> 35</span></a> <span class="n">AGENTS_GATEKEEPER</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="MessageProcessor-36"><a href="#MessageProcessor-36"><span class="linenos"> 36</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="MessageProcessor-37"><a href="#MessageProcessor-37"><span class="linenos"> 37</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_SOLVE&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-37"><a href="#MessageProcessor-37"><span class="linenos"> 37</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_GATEKEEPER&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-38"><a href="#MessageProcessor-38"><span class="linenos"> 38</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-39"><a href="#MessageProcessor-39"><span class="linenos"> 39</span></a> <span class="n">AGENTS_GATEKEEPER</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span>
</span><span id="MessageProcessor-40"><a href="#MessageProcessor-40"><span class="linenos"> 40</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">),</span>
</span><span id="MessageProcessor-41"><a href="#MessageProcessor-41"><span class="linenos"> 41</span></a> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AGENTS_GATEKEEPER&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span id="MessageProcessor-42"><a href="#MessageProcessor-42"><span class="linenos"> 42</span></a> <span class="p">))</span>
</span><span id="MessageProcessor-39"><a href="#MessageProcessor-39"><span class="linenos"> 39</span></a>
</span><span id="MessageProcessor-40"><a href="#MessageProcessor-40"><span class="linenos"> 40</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">:</span><span class="n">DB</span><span class="p">):</span>
</span><span id="MessageProcessor-41"><a href="#MessageProcessor-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
</span><span id="MessageProcessor-42"><a href="#MessageProcessor-42"><span class="linenos"> 42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">management_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">)</span>
</span><span id="MessageProcessor-43"><a href="#MessageProcessor-43"><span class="linenos"> 43</span></a>
</span><span id="MessageProcessor-44"><a href="#MessageProcessor-44"><span class="linenos"> 44</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">:</span><span class="n">DB</span><span class="p">):</span>
</span><span id="MessageProcessor-45"><a href="#MessageProcessor-45"><span class="linenos"> 45</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
</span><span id="MessageProcessor-46"><a href="#MessageProcessor-46"><span class="linenos"> 46</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">management_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">)</span>
</span><span id="MessageProcessor-47"><a href="#MessageProcessor-47"><span class="linenos"> 47</span></a>
</span><span id="MessageProcessor-48"><a href="#MessageProcessor-48"><span class="linenos"> 48</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-49"><a href="#MessageProcessor-49"><span class="linenos"> 49</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Process Agent (AGENTS_PROCESS) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-50"><a href="#MessageProcessor-50"><span class="linenos"> 50</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-51"><a href="#MessageProcessor-51"><span class="linenos"> 51</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Solve Agent (AGENTS_SOLVE) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-52"><a href="#MessageProcessor-52"><span class="linenos"> 52</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-53"><a href="#MessageProcessor-53"><span class="linenos"> 53</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Gatekeeper Agent (AGENTS_GATEKEEPER) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-44"><a href="#MessageProcessor-44"><span class="linenos"> 44</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-45"><a href="#MessageProcessor-45"><span class="linenos"> 45</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Process Agent (AGENTS_PROCESS) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-46"><a href="#MessageProcessor-46"><span class="linenos"> 46</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-47"><a href="#MessageProcessor-47"><span class="linenos"> 47</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Solve Agent (AGENTS_SOLVE) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-48"><a href="#MessageProcessor-48"><span class="linenos"> 48</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-49"><a href="#MessageProcessor-49"><span class="linenos"> 49</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Gatekeeper Agent (AGENTS_GATEKEEPER) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-50"><a href="#MessageProcessor-50"><span class="linenos"> 50</span></a>
</span><span id="MessageProcessor-51"><a href="#MessageProcessor-51"><span class="linenos"> 51</span></a> <span class="k">def</span> <span class="nf">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">:</span><span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="MessageProcessor-52"><a href="#MessageProcessor-52"><span class="linenos"> 52</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^https?://([^:]*)(?::(\d+))?$&#39;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
</span><span id="MessageProcessor-53"><a href="#MessageProcessor-53"><span class="linenos"> 53</span></a> <span class="k">return</span> <span class="s2">&quot;unknown&quot;</span> <span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span id="MessageProcessor-54"><a href="#MessageProcessor-54"><span class="linenos"> 54</span></a>
</span><span id="MessageProcessor-55"><a href="#MessageProcessor-55"><span class="linenos"> 55</span></a> <span class="k">def</span> <span class="nf">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">:</span><span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="MessageProcessor-56"><a href="#MessageProcessor-56"><span class="linenos"> 56</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^https?://([^:]*)(?::(\d+))?$&#39;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
</span><span id="MessageProcessor-57"><a href="#MessageProcessor-57"><span class="linenos"> 57</span></a> <span class="k">return</span> <span class="s2">&quot;unknown&quot;</span> <span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span id="MessageProcessor-58"><a href="#MessageProcessor-58"><span class="linenos"> 58</span></a>
</span><span id="MessageProcessor-59"><a href="#MessageProcessor-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="MessageProcessor-60"><a href="#MessageProcessor-60"><span class="linenos"> 60</span></a> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">receiver</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span>
</span><span id="MessageProcessor-61"><a href="#MessageProcessor-61"><span class="linenos"> 61</span></a> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span>
</span><span id="MessageProcessor-62"><a href="#MessageProcessor-62"><span class="linenos"> 62</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="MessageProcessor-55"><a href="#MessageProcessor-55"><span class="linenos"> 55</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="MessageProcessor-56"><a href="#MessageProcessor-56"><span class="linenos"> 56</span></a> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">receiver</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span>
</span><span id="MessageProcessor-57"><a href="#MessageProcessor-57"><span class="linenos"> 57</span></a> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span>
</span><span id="MessageProcessor-58"><a href="#MessageProcessor-58"><span class="linenos"> 58</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="MessageProcessor-59"><a href="#MessageProcessor-59"><span class="linenos"> 59</span></a>
</span><span id="MessageProcessor-60"><a href="#MessageProcessor-60"><span class="linenos"> 60</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="MessageProcessor-61"><a href="#MessageProcessor-61"><span class="linenos"> 61</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-62"><a href="#MessageProcessor-62"><span class="linenos"> 62</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_process_message</span><span class="p">,</span> <span class="n">db_count</span><span class="p">)</span>
</span><span id="MessageProcessor-63"><a href="#MessageProcessor-63"><span class="linenos"> 63</span></a>
</span><span id="MessageProcessor-64"><a href="#MessageProcessor-64"><span class="linenos"> 64</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="MessageProcessor-65"><a href="#MessageProcessor-65"><span class="linenos"> 65</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-66"><a href="#MessageProcessor-66"><span class="linenos"> 66</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_process_message</span><span class="p">,</span> <span class="n">db_count</span><span class="p">)</span>
</span><span id="MessageProcessor-67"><a href="#MessageProcessor-67"><span class="linenos"> 67</span></a>
</span><span id="MessageProcessor-68"><a href="#MessageProcessor-68"><span class="linenos"> 68</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor-69"><a href="#MessageProcessor-69"><span class="linenos"> 69</span></a> <span class="n">count</span><span class="o">=</span><span class="n">db_count</span><span class="p">,</span>
</span><span id="MessageProcessor-70"><a href="#MessageProcessor-70"><span class="linenos"> 70</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added message to queue&quot;</span>
</span><span id="MessageProcessor-71"><a href="#MessageProcessor-71"><span class="linenos"> 71</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-72"><a href="#MessageProcessor-72"><span class="linenos"> 72</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="MessageProcessor-73"><a href="#MessageProcessor-73"><span class="linenos"> 73</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor-74"><a href="#MessageProcessor-74"><span class="linenos"> 74</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor-75"><a href="#MessageProcessor-75"><span class="linenos"> 75</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="MessageProcessor-76"><a href="#MessageProcessor-76"><span class="linenos"> 76</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="MessageProcessor-77"><a href="#MessageProcessor-77"><span class="linenos"> 77</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-78"><a href="#MessageProcessor-78"><span class="linenos"> 78</span></a>
</span><span id="MessageProcessor-79"><a href="#MessageProcessor-79"><span class="linenos"> 79</span></a> <span class="k">def</span> <span class="nf">_process_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">ignore_processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="MessageProcessor-80"><a href="#MessageProcessor-80"><span class="linenos"> 80</span></a> <span class="n">db_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="MessageProcessor-64"><a href="#MessageProcessor-64"><span class="linenos"> 64</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor-65"><a href="#MessageProcessor-65"><span class="linenos"> 65</span></a> <span class="n">count</span><span class="o">=</span><span class="n">db_count</span><span class="p">,</span>
</span><span id="MessageProcessor-66"><a href="#MessageProcessor-66"><span class="linenos"> 66</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added message to queue&quot;</span>
</span><span id="MessageProcessor-67"><a href="#MessageProcessor-67"><span class="linenos"> 67</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-68"><a href="#MessageProcessor-68"><span class="linenos"> 68</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="MessageProcessor-69"><a href="#MessageProcessor-69"><span class="linenos"> 69</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor-70"><a href="#MessageProcessor-70"><span class="linenos"> 70</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor-71"><a href="#MessageProcessor-71"><span class="linenos"> 71</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="MessageProcessor-72"><a href="#MessageProcessor-72"><span class="linenos"> 72</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="MessageProcessor-73"><a href="#MessageProcessor-73"><span class="linenos"> 73</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-74"><a href="#MessageProcessor-74"><span class="linenos"> 74</span></a>
</span><span id="MessageProcessor-75"><a href="#MessageProcessor-75"><span class="linenos"> 75</span></a> <span class="k">def</span> <span class="nf">_process_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">,</span> <span class="n">ignore_processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="MessageProcessor-76"><a href="#MessageProcessor-76"><span class="linenos"> 76</span></a> <span class="n">db_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">by_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span><span id="MessageProcessor-77"><a href="#MessageProcessor-77"><span class="linenos"> 77</span></a>
</span><span id="MessageProcessor-78"><a href="#MessageProcessor-78"><span class="linenos"> 78</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">processed</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ignore_processed</span><span class="p">:</span>
</span><span id="MessageProcessor-79"><a href="#MessageProcessor-79"><span class="linenos"> 79</span></a> <span class="c1"># do not process processed messages again</span>
</span><span id="MessageProcessor-80"><a href="#MessageProcessor-80"><span class="linenos"> 80</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-81"><a href="#MessageProcessor-81"><span class="linenos"> 81</span></a>
</span><span id="MessageProcessor-82"><a href="#MessageProcessor-82"><span class="linenos"> 82</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">processed</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ignore_processed</span><span class="p">:</span>
</span><span id="MessageProcessor-83"><a href="#MessageProcessor-83"><span class="linenos"> 83</span></a> <span class="c1"># do not process processed messages again</span>
</span><span id="MessageProcessor-84"><a href="#MessageProcessor-84"><span class="linenos"> 84</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-85"><a href="#MessageProcessor-85"><span class="linenos"> 85</span></a>
</span><span id="MessageProcessor-86"><a href="#MessageProcessor-86"><span class="linenos"> 86</span></a> <span class="c1"># now message processed!</span>
</span><span id="MessageProcessor-87"><a href="#MessageProcessor-87"><span class="linenos"> 87</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="MessageProcessor-88"><a href="#MessageProcessor-88"><span class="linenos"> 88</span></a>
</span><span id="MessageProcessor-89"><a href="#MessageProcessor-89"><span class="linenos"> 89</span></a> <span class="c1"># increment contacts counter</span>
</span><span id="MessageProcessor-90"><a href="#MessageProcessor-90"><span class="linenos"> 90</span></a> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">contacts</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="MessageProcessor-91"><a href="#MessageProcessor-91"><span class="linenos"> 91</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">contacts</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">MESSAGE_MAX_CONTACTS</span><span class="p">:</span>
</span><span id="MessageProcessor-92"><a href="#MessageProcessor-92"><span class="linenos"> 92</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Message reached max number of contacts! </span><span class="si">{</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-93"><a href="#MessageProcessor-93"><span class="linenos"> 93</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-82"><a href="#MessageProcessor-82"><span class="linenos"> 82</span></a> <span class="c1"># check which step/ state the message requires the management to do</span>
</span><span id="MessageProcessor-83"><a href="#MessageProcessor-83"><span class="linenos"> 83</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-84"><a href="#MessageProcessor-84"><span class="linenos"> 84</span></a> <span class="c1"># send to extract agents</span>
</span><span id="MessageProcessor-85"><a href="#MessageProcessor-85"><span class="linenos"> 85</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-86"><a href="#MessageProcessor-86"><span class="linenos"> 86</span></a>
</span><span id="MessageProcessor-87"><a href="#MessageProcessor-87"><span class="linenos"> 87</span></a> <span class="k">elif</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-88"><a href="#MessageProcessor-88"><span class="linenos"> 88</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-89"><a href="#MessageProcessor-89"><span class="linenos"> 89</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-90"><a href="#MessageProcessor-90"><span class="linenos"> 90</span></a>
</span><span id="MessageProcessor-91"><a href="#MessageProcessor-91"><span class="linenos"> 91</span></a> <span class="k">elif</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-92"><a href="#MessageProcessor-92"><span class="linenos"> 92</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-93"><a href="#MessageProcessor-93"><span class="linenos"> 93</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-94"><a href="#MessageProcessor-94"><span class="linenos"> 94</span></a>
</span><span id="MessageProcessor-95"><a href="#MessageProcessor-95"><span class="linenos"> 95</span></a> <span class="c1"># check which step/ state the message requires the management to do</span>
</span><span id="MessageProcessor-96"><a href="#MessageProcessor-96"><span class="linenos"> 96</span></a> <span class="c1"># -&gt; IF</span>
</span><span id="MessageProcessor-97"><a href="#MessageProcessor-97"><span class="linenos"> 97</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-98"><a href="#MessageProcessor-98"><span class="linenos"> 98</span></a> <span class="c1"># send to extract agents</span>
</span><span id="MessageProcessor-99"><a href="#MessageProcessor-99"><span class="linenos"> 99</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-100"><a href="#MessageProcessor-100"><span class="linenos">100</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-101"><a href="#MessageProcessor-101"><span class="linenos">101</span></a>
</span><span id="MessageProcessor-102"><a href="#MessageProcessor-102"><span class="linenos">102</span></a> <span class="c1"># combine different extractions in data items</span>
</span><span id="MessageProcessor-103"><a href="#MessageProcessor-103"><span class="linenos">103</span></a> <span class="c1"># will update items in `db_message.message.data`</span>
</span><span id="MessageProcessor-104"><a href="#MessageProcessor-104"><span class="linenos">104</span></a> <span class="n">fully_extracted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_extractions</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</span><span id="MessageProcessor-105"><a href="#MessageProcessor-105"><span class="linenos">105</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">REQUIRE_FULL_EXTRACT</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">fully_extracted</span><span class="p">:</span>
</span><span id="MessageProcessor-106"><a href="#MessageProcessor-106"><span class="linenos">106</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Postpone message, wait for full extract of items! </span><span class="si">{</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-107"><a href="#MessageProcessor-107"><span class="linenos">107</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-108"><a href="#MessageProcessor-108"><span class="linenos">108</span></a>
</span><span id="MessageProcessor-109"><a href="#MessageProcessor-109"><span class="linenos">109</span></a> <span class="c1"># -&gt; EL IF</span>
</span><span id="MessageProcessor-110"><a href="#MessageProcessor-110"><span class="linenos">110</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-111"><a href="#MessageProcessor-111"><span class="linenos">111</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-112"><a href="#MessageProcessor-112"><span class="linenos">112</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-113"><a href="#MessageProcessor-113"><span class="linenos">113</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-114"><a href="#MessageProcessor-114"><span class="linenos">114</span></a>
</span><span id="MessageProcessor-115"><a href="#MessageProcessor-115"><span class="linenos">115</span></a> <span class="c1"># combine different solutions</span>
</span><span id="MessageProcessor-116"><a href="#MessageProcessor-116"><span class="linenos">116</span></a> <span class="c1"># will add solutions received before to `db_message.message.solution`</span>
</span><span id="MessageProcessor-117"><a href="#MessageProcessor-117"><span class="linenos">117</span></a> <span class="n">fully_solved</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_solutions</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">solution</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span><span class="p">)</span>
</span><span id="MessageProcessor-118"><a href="#MessageProcessor-118"><span class="linenos">118</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">REQUIRE_FULL_SOLVE</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">fully_solved</span><span class="p">:</span>
</span><span id="MessageProcessor-119"><a href="#MessageProcessor-119"><span class="linenos">119</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Postpone message, wait for all solutions of riddle! </span><span class="si">{</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-120"><a href="#MessageProcessor-120"><span class="linenos">120</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-121"><a href="#MessageProcessor-121"><span class="linenos">121</span></a>
</span><span id="MessageProcessor-122"><a href="#MessageProcessor-122"><span class="linenos">122</span></a> <span class="c1"># -&gt; EL IF </span>
</span><span id="MessageProcessor-123"><a href="#MessageProcessor-123"><span class="linenos">123</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span><span class="p">:</span>
</span><span id="MessageProcessor-124"><a href="#MessageProcessor-124"><span class="linenos">124</span></a> <span class="c1"># send to solve agents</span>
</span><span id="MessageProcessor-125"><a href="#MessageProcessor-125"><span class="linenos">125</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">,</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-126"><a href="#MessageProcessor-126"><span class="linenos">126</span></a> <span class="k">return</span>
</span><span id="MessageProcessor-127"><a href="#MessageProcessor-127"><span class="linenos">127</span></a>
</span><span id="MessageProcessor-128"><a href="#MessageProcessor-128"><span class="linenos">128</span></a> <span class="c1"># -&gt; ELSE</span>
</span><span id="MessageProcessor-129"><a href="#MessageProcessor-129"><span class="linenos">129</span></a> <span class="c1"># all steps &quot;done&quot;</span>
</span><span id="MessageProcessor-130"><a href="#MessageProcessor-130"><span class="linenos">130</span></a>
</span><span id="MessageProcessor-131"><a href="#MessageProcessor-131"><span class="linenos">131</span></a> <span class="c1"># validate not required? (then solved will never be set to true, thus set it here)</span>
</span><span id="MessageProcessor-132"><a href="#MessageProcessor-132"><span class="linenos">132</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-133"><a href="#MessageProcessor-133"><span class="linenos">133</span></a> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-134"><a href="#MessageProcessor-134"><span class="linenos">134</span></a>
</span><span id="MessageProcessor-135"><a href="#MessageProcessor-135"><span class="linenos">135</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span><span class="p">:</span>
</span><span id="MessageProcessor-136"><a href="#MessageProcessor-136"><span class="linenos">136</span></a> <span class="c1"># yay, message is solved</span>
</span><span id="MessageProcessor-137"><a href="#MessageProcessor-137"><span class="linenos">137</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">True</span><span class="p">);</span>
</span><span id="MessageProcessor-138"><a href="#MessageProcessor-138"><span class="linenos">138</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-139"><a href="#MessageProcessor-139"><span class="linenos">139</span></a> <span class="c1"># not solved, but all steps done</span>
</span><span id="MessageProcessor-140"><a href="#MessageProcessor-140"><span class="linenos">140</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">False</span><span class="p">);</span>
</span><span id="MessageProcessor-141"><a href="#MessageProcessor-141"><span class="linenos">141</span></a>
</span><span id="MessageProcessor-142"><a href="#MessageProcessor-142"><span class="linenos">142</span></a> <span class="c1"># try again</span>
</span><span id="MessageProcessor-143"><a href="#MessageProcessor-143"><span class="linenos">143</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_do_again</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-144"><a href="#MessageProcessor-144"><span class="linenos">144</span></a>
</span><span id="MessageProcessor-145"><a href="#MessageProcessor-145"><span class="linenos">145</span></a> <span class="k">def</span> <span class="nf">_hash_solution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">:</span><span class="n">RiddleSolution</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="MessageProcessor-146"><a href="#MessageProcessor-146"><span class="linenos">146</span></a> <span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="n">s</span><span class="o">.</span><span class="n">solution</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">explanation</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">((</span><span class="n">d</span><span class="o">.</span><span class="n">file_plain</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">s</span><span class="o">.</span><span class="n">used_data</span><span class="p">)))</span>
</span><span id="MessageProcessor-147"><a href="#MessageProcessor-147"><span class="linenos">147</span></a>
</span><span id="MessageProcessor-148"><a href="#MessageProcessor-148"><span class="linenos">148</span></a> <span class="k">def</span> <span class="nf">_add_solutions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle_id</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">RiddleSolution</span><span class="p">],</span> <span class="n">trial</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-149"><a href="#MessageProcessor-149"><span class="linenos">149</span></a> <span class="c1"># do not do anything, if all solutions available</span>
</span><span id="MessageProcessor-150"><a href="#MessageProcessor-150"><span class="linenos">150</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">):</span>
</span><span id="MessageProcessor-151"><a href="#MessageProcessor-151"><span class="linenos">151</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MessageProcessor-152"><a href="#MessageProcessor-152"><span class="linenos">152</span></a>
</span><span id="MessageProcessor-153"><a href="#MessageProcessor-153"><span class="linenos">153</span></a> <span class="n">contained</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_solution</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">solution</span><span class="p">)</span>
</span><span id="MessageProcessor-154"><a href="#MessageProcessor-154"><span class="linenos">154</span></a>
</span><span id="MessageProcessor-155"><a href="#MessageProcessor-155"><span class="linenos">155</span></a> <span class="c1"># search db for solutions from before </span>
</span><span id="MessageProcessor-156"><a href="#MessageProcessor-156"><span class="linenos">156</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span>
</span><span id="MessageProcessor-157"><a href="#MessageProcessor-157"><span class="linenos">157</span></a> <span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">,</span>
</span><span id="MessageProcessor-158"><a href="#MessageProcessor-158"><span class="linenos">158</span></a> <span class="n">limit</span><span class="o">=</span><span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">len</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">),</span> <span class="mi">250</span><span class="p">)</span>
</span><span id="MessageProcessor-159"><a href="#MessageProcessor-159"><span class="linenos">159</span></a> <span class="p">):</span>
</span><span id="MessageProcessor-160"><a href="#MessageProcessor-160"><span class="linenos">160</span></a> <span class="c1"># make sure to only use solutions from same &quot;trial&quot;</span>
</span><span id="MessageProcessor-161"><a href="#MessageProcessor-161"><span class="linenos">161</span></a> <span class="k">if</span> <span class="n">row</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">==</span> <span class="n">trial</span><span class="p">:</span>
</span><span id="MessageProcessor-162"><a href="#MessageProcessor-162"><span class="linenos">162</span></a> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">row</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">solution</span><span class="p">:</span>
</span><span id="MessageProcessor-163"><a href="#MessageProcessor-163"><span class="linenos">163</span></a> <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_solution</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</span><span id="MessageProcessor-164"><a href="#MessageProcessor-164"><span class="linenos">164</span></a> <span class="k">if</span> <span class="n">h</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">contained</span><span class="p">:</span>
</span><span id="MessageProcessor-165"><a href="#MessageProcessor-165"><span class="linenos">165</span></a> <span class="c1"># add the &#39;new&#39; solution</span>
</span><span id="MessageProcessor-166"><a href="#MessageProcessor-166"><span class="linenos">166</span></a> <span class="n">solution</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</span><span id="MessageProcessor-167"><a href="#MessageProcessor-167"><span class="linenos">167</span></a> <span class="n">contained</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span><span id="MessageProcessor-168"><a href="#MessageProcessor-168"><span class="linenos">168</span></a>
</span><span id="MessageProcessor-169"><a href="#MessageProcessor-169"><span class="linenos">169</span></a> <span class="c1"># all solutions found ?</span>
</span><span id="MessageProcessor-170"><a href="#MessageProcessor-170"><span class="linenos">170</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">):</span>
</span><span id="MessageProcessor-171"><a href="#MessageProcessor-171"><span class="linenos">171</span></a> <span class="k">break</span>
</span><span id="MessageProcessor-172"><a href="#MessageProcessor-172"><span class="linenos">172</span></a>
</span><span id="MessageProcessor-173"><a href="#MessageProcessor-173"><span class="linenos">173</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span>
</span><span id="MessageProcessor-174"><a href="#MessageProcessor-174"><span class="linenos">174</span></a>
</span><span id="MessageProcessor-175"><a href="#MessageProcessor-175"><span class="linenos">175</span></a> <span class="k">def</span> <span class="nf">_hash_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span><span class="n">RiddleData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="MessageProcessor-176"><a href="#MessageProcessor-176"><span class="linenos">176</span></a> <span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="n">d</span><span class="o">.</span><span class="n">file_plain</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">prompt</span><span class="p">))</span>
</span><span id="MessageProcessor-177"><a href="#MessageProcessor-177"><span class="linenos">177</span></a>
</span><span id="MessageProcessor-178"><a href="#MessageProcessor-178"><span class="linenos">178</span></a> <span class="k">def</span> <span class="nf">_add_extractions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">riddle_id</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="n">RiddleData</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-179"><a href="#MessageProcessor-179"><span class="linenos">179</span></a> <span class="c1"># get all the data items without extraction</span>
</span><span id="MessageProcessor-180"><a href="#MessageProcessor-180"><span class="linenos">180</span></a> <span class="n">empty_data</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="MessageProcessor-181"><a href="#MessageProcessor-181"><span class="linenos">181</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
</span><span id="MessageProcessor-182"><a href="#MessageProcessor-182"><span class="linenos">182</span></a> <span class="k">if</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="MessageProcessor-183"><a href="#MessageProcessor-183"><span class="linenos">183</span></a> <span class="n">empty_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)]</span> <span class="o">=</span> <span class="n">i</span>
</span><span id="MessageProcessor-184"><a href="#MessageProcessor-184"><span class="linenos">184</span></a>
</span><span id="MessageProcessor-185"><a href="#MessageProcessor-185"><span class="linenos">185</span></a> <span class="c1"># do not do anything if fully extracted</span>
</span><span id="MessageProcessor-186"><a href="#MessageProcessor-186"><span class="linenos">186</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">empty_data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-187"><a href="#MessageProcessor-187"><span class="linenos">187</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MessageProcessor-188"><a href="#MessageProcessor-188"><span class="linenos">188</span></a>
</span><span id="MessageProcessor-189"><a href="#MessageProcessor-189"><span class="linenos">189</span></a> <span class="c1"># search db for extractions already available</span>
</span><span id="MessageProcessor-190"><a href="#MessageProcessor-190"><span class="linenos">190</span></a> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">iterate</span><span class="p">(</span>
</span><span id="MessageProcessor-191"><a href="#MessageProcessor-191"><span class="linenos">191</span></a> <span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">,</span>
</span><span id="MessageProcessor-192"><a href="#MessageProcessor-192"><span class="linenos">192</span></a> <span class="n">limit</span><span class="o">=</span><span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">len</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">riddle_id</span><span class="p">),</span> <span class="mi">250</span><span class="p">)</span>
</span><span id="MessageProcessor-193"><a href="#MessageProcessor-193"><span class="linenos">193</span></a> <span class="p">):</span>
</span><span id="MessageProcessor-194"><a href="#MessageProcessor-194"><span class="linenos">194</span></a> <span class="c1"># check for required extraction</span>
</span><span id="MessageProcessor-195"><a href="#MessageProcessor-195"><span class="linenos">195</span></a> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">row</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
</span><span id="MessageProcessor-196"><a href="#MessageProcessor-196"><span class="linenos">196</span></a> <span class="c1"># already extracted ? </span>
</span><span id="MessageProcessor-197"><a href="#MessageProcessor-197"><span class="linenos">197</span></a> <span class="c1"># extraction file exists ?</span>
</span><span id="MessageProcessor-198"><a href="#MessageProcessor-198"><span class="linenos">198</span></a> <span class="c1"># one of the items, we do not have extractions for ?</span>
</span><span id="MessageProcessor-199"><a href="#MessageProcessor-199"><span class="linenos">199</span></a> <span class="c1"># the same data item ?</span>
</span><span id="MessageProcessor-200"><a href="#MessageProcessor-200"><span class="linenos">200</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span> <span class="ow">is</span> <span class="kc">None</span> \
</span><span id="MessageProcessor-201"><a href="#MessageProcessor-201"><span class="linenos">201</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;missing:&quot;</span><span class="p">)</span> \
</span><span id="MessageProcessor-202"><a href="#MessageProcessor-202"><span class="linenos">202</span></a> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="ow">in</span> <span class="n">empty_data</span><span class="p">:</span>
</span><span id="MessageProcessor-203"><a href="#MessageProcessor-203"><span class="linenos">203</span></a> <span class="c1"># copy the reference to the extracted data</span>
</span><span id="MessageProcessor-204"><a href="#MessageProcessor-204"><span class="linenos">204</span></a> <span class="n">data</span><span class="p">[</span><span class="n">empty_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)]]</span><span class="o">.</span><span class="n">file_extracted</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">file_extracted</span>
</span><span id="MessageProcessor-205"><a href="#MessageProcessor-205"><span class="linenos">205</span></a> <span class="c1"># remove from items we need extracted data for</span>
</span><span id="MessageProcessor-206"><a href="#MessageProcessor-206"><span class="linenos">206</span></a> <span class="k">del</span> <span class="n">empty_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_data</span><span class="p">(</span><span class="n">d</span><span class="p">)]</span>
</span><span id="MessageProcessor-207"><a href="#MessageProcessor-207"><span class="linenos">207</span></a>
</span><span id="MessageProcessor-208"><a href="#MessageProcessor-208"><span class="linenos">208</span></a> <span class="c1"># break if all extractions found</span>
</span><span id="MessageProcessor-209"><a href="#MessageProcessor-209"><span class="linenos">209</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">empty_data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-210"><a href="#MessageProcessor-210"><span class="linenos">210</span></a> <span class="k">break</span>
</span><span id="MessageProcessor-211"><a href="#MessageProcessor-211"><span class="linenos">211</span></a>
</span><span id="MessageProcessor-212"><a href="#MessageProcessor-212"><span class="linenos">212</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">empty_data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="c1"># fully extracted</span>
</span><span id="MessageProcessor-213"><a href="#MessageProcessor-213"><span class="linenos">213</span></a>
</span><span id="MessageProcessor-214"><a href="#MessageProcessor-214"><span class="linenos">214</span></a> <span class="k">def</span> <span class="nf">_do_again</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">):</span>
</span><span id="MessageProcessor-215"><a href="#MessageProcessor-215"><span class="linenos">215</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">SOLUTION_MAX_TRIALS</span><span class="p">:</span>
</span><span id="MessageProcessor-216"><a href="#MessageProcessor-216"><span class="linenos">216</span></a> <span class="c1"># try again, recycle message</span>
</span><span id="MessageProcessor-217"><a href="#MessageProcessor-217"><span class="linenos">217</span></a>
</span><span id="MessageProcessor-218"><a href="#MessageProcessor-218"><span class="linenos">218</span></a> <span class="c1"># require steps again</span>
</span><span id="MessageProcessor-219"><a href="#MessageProcessor-219"><span class="linenos">219</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-220"><a href="#MessageProcessor-220"><span class="linenos">220</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-221"><a href="#MessageProcessor-221"><span class="linenos">221</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-222"><a href="#MessageProcessor-222"><span class="linenos">222</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-223"><a href="#MessageProcessor-223"><span class="linenos">223</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-224"><a href="#MessageProcessor-224"><span class="linenos">224</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-225"><a href="#MessageProcessor-225"><span class="linenos">225</span></a>
</span><span id="MessageProcessor-226"><a href="#MessageProcessor-226"><span class="linenos">226</span></a> <span class="c1"># increment trial</span>
</span><span id="MessageProcessor-227"><a href="#MessageProcessor-227"><span class="linenos">227</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="MessageProcessor-228"><a href="#MessageProcessor-228"><span class="linenos">228</span></a>
</span><span id="MessageProcessor-229"><a href="#MessageProcessor-229"><span class="linenos">229</span></a> <span class="c1"># append current solution(s) als old one(s)</span>
</span><span id="MessageProcessor-230"><a href="#MessageProcessor-230"><span class="linenos">230</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">solution</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor-231"><a href="#MessageProcessor-231"><span class="linenos">231</span></a> <span class="n">message</span><span class="o">.</span><span class="n">riddle</span><span class="o">.</span><span class="n">solutions_before</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
</span><span id="MessageProcessor-232"><a href="#MessageProcessor-232"><span class="linenos">232</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span>
</span><span id="MessageProcessor-233"><a href="#MessageProcessor-233"><span class="linenos">233</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-234"><a href="#MessageProcessor-234"><span class="linenos">234</span></a> <span class="c1"># reset current solution</span>
</span><span id="MessageProcessor-235"><a href="#MessageProcessor-235"><span class="linenos">235</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="MessageProcessor-236"><a href="#MessageProcessor-236"><span class="linenos">236</span></a>
</span><span id="MessageProcessor-237"><a href="#MessageProcessor-237"><span class="linenos">237</span></a> <span class="c1"># add the riddle as new to management</span>
</span><span id="MessageProcessor-238"><a href="#MessageProcessor-238"><span class="linenos">238</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-239"><a href="#MessageProcessor-239"><span class="linenos">239</span></a>
</span><span id="MessageProcessor-240"><a href="#MessageProcessor-240"><span class="linenos">240</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-241"><a href="#MessageProcessor-241"><span class="linenos">241</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsolved riddle after max number of trials: </span><span class="si">{</span><span class="n">message</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-242"><a href="#MessageProcessor-242"><span class="linenos">242</span></a>
</span><span id="MessageProcessor-243"><a href="#MessageProcessor-243"><span class="linenos">243</span></a> <span class="k">def</span> <span class="nf">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipients</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-244"><a href="#MessageProcessor-244"><span class="linenos">244</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-245"><a href="#MessageProcessor-245"><span class="linenos">245</span></a> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">recipients</span><span class="p">:</span>
</span><span id="MessageProcessor-246"><a href="#MessageProcessor-246"><span class="linenos">246</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="n">ok</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-247"><a href="#MessageProcessor-247"><span class="linenos">247</span></a> <span class="k">return</span> <span class="n">ok</span>
</span><span id="MessageProcessor-248"><a href="#MessageProcessor-248"><span class="linenos">248</span></a>
</span><span id="MessageProcessor-249"><a href="#MessageProcessor-249"><span class="linenos">249</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-250"><a href="#MessageProcessor-250"><span class="linenos">250</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span>
</span><span id="MessageProcessor-251"><a href="#MessageProcessor-251"><span class="linenos">251</span></a> <span class="n">sender</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">management_name</span><span class="p">,</span>
</span><span id="MessageProcessor-252"><a href="#MessageProcessor-252"><span class="linenos">252</span></a> <span class="n">recipient</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="MessageProcessor-253"><a href="#MessageProcessor-253"><span class="linenos">253</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="MessageProcessor-254"><a href="#MessageProcessor-254"><span class="linenos">254</span></a> <span class="n">processed</span><span class="o">=</span><span class="kc">False</span>
</span><span id="MessageProcessor-255"><a href="#MessageProcessor-255"><span class="linenos">255</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-256"><a href="#MessageProcessor-256"><span class="linenos">256</span></a>
</span><span id="MessageProcessor-257"><a href="#MessageProcessor-257"><span class="linenos">257</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="MessageProcessor-258"><a href="#MessageProcessor-258"><span class="linenos">258</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="MessageProcessor-259"><a href="#MessageProcessor-259"><span class="linenos">259</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="MessageProcessor-260"><a href="#MessageProcessor-260"><span class="linenos">260</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="MessageProcessor-261"><a href="#MessageProcessor-261"><span class="linenos">261</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-262"><a href="#MessageProcessor-262"><span class="linenos">262</span></a>
</span><span id="MessageProcessor-263"><a href="#MessageProcessor-263"><span class="linenos">263</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="MessageProcessor-264"><a href="#MessageProcessor-264"><span class="linenos">264</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">db_count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="MessageProcessor-265"><a href="#MessageProcessor-265"><span class="linenos">265</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MessageProcessor-266"><a href="#MessageProcessor-266"><span class="linenos">266</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-267"><a href="#MessageProcessor-267"><span class="linenos">267</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to: </span><span class="si">{</span><span class="n">recipient</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-268"><a href="#MessageProcessor-268"><span class="linenos">268</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="MessageProcessor-95"><a href="#MessageProcessor-95"><span class="linenos"> 95</span></a> <span class="k">else</span><span class="p">:</span> <span class="c1"># all steps &quot;done&quot;</span>
</span><span id="MessageProcessor-96"><a href="#MessageProcessor-96"><span class="linenos"> 96</span></a>
</span><span id="MessageProcessor-97"><a href="#MessageProcessor-97"><span class="linenos"> 97</span></a> <span class="c1"># validate not required? (then solved will never be set to true, thus set it here)</span>
</span><span id="MessageProcessor-98"><a href="#MessageProcessor-98"><span class="linenos"> 98</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-99"><a href="#MessageProcessor-99"><span class="linenos"> 99</span></a> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-100"><a href="#MessageProcessor-100"><span class="linenos">100</span></a>
</span><span id="MessageProcessor-101"><a href="#MessageProcessor-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solved</span><span class="p">:</span>
</span><span id="MessageProcessor-102"><a href="#MessageProcessor-102"><span class="linenos">102</span></a> <span class="c1"># yay, message is solved</span>
</span><span id="MessageProcessor-103"><a href="#MessageProcessor-103"><span class="linenos">103</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">True</span><span class="p">);</span>
</span><span id="MessageProcessor-104"><a href="#MessageProcessor-104"><span class="linenos">104</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-105"><a href="#MessageProcessor-105"><span class="linenos">105</span></a> <span class="c1"># not solved, but all steps done</span>
</span><span id="MessageProcessor-106"><a href="#MessageProcessor-106"><span class="linenos">106</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_solution</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">solution</span><span class="o">=</span><span class="kc">False</span><span class="p">);</span>
</span><span id="MessageProcessor-107"><a href="#MessageProcessor-107"><span class="linenos">107</span></a>
</span><span id="MessageProcessor-108"><a href="#MessageProcessor-108"><span class="linenos">108</span></a> <span class="c1"># try again</span>
</span><span id="MessageProcessor-109"><a href="#MessageProcessor-109"><span class="linenos">109</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_do_again</span><span class="p">(</span><span class="n">db_message</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-110"><a href="#MessageProcessor-110"><span class="linenos">110</span></a>
</span><span id="MessageProcessor-111"><a href="#MessageProcessor-111"><span class="linenos">111</span></a> <span class="c1"># now message processed!</span>
</span><span id="MessageProcessor-112"><a href="#MessageProcessor-112"><span class="linenos">112</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="MessageProcessor-113"><a href="#MessageProcessor-113"><span class="linenos">113</span></a>
</span><span id="MessageProcessor-114"><a href="#MessageProcessor-114"><span class="linenos">114</span></a> <span class="k">def</span> <span class="nf">_do_again</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">):</span>
</span><span id="MessageProcessor-115"><a href="#MessageProcessor-115"><span class="linenos">115</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">SOLUTION_MAX_TRIALS</span><span class="p">:</span>
</span><span id="MessageProcessor-116"><a href="#MessageProcessor-116"><span class="linenos">116</span></a> <span class="c1"># try again, recycle message</span>
</span><span id="MessageProcessor-117"><a href="#MessageProcessor-117"><span class="linenos">117</span></a>
</span><span id="MessageProcessor-118"><a href="#MessageProcessor-118"><span class="linenos">118</span></a> <span class="c1"># require steps again</span>
</span><span id="MessageProcessor-119"><a href="#MessageProcessor-119"><span class="linenos">119</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-120"><a href="#MessageProcessor-120"><span class="linenos">120</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">extract</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-121"><a href="#MessageProcessor-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-122"><a href="#MessageProcessor-122"><span class="linenos">122</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">solve</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-123"><a href="#MessageProcessor-123"><span class="linenos">123</span></a> <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
</span><span id="MessageProcessor-124"><a href="#MessageProcessor-124"><span class="linenos">124</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">validate</span><span class="o">.</span><span class="n">finished</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="MessageProcessor-125"><a href="#MessageProcessor-125"><span class="linenos">125</span></a>
</span><span id="MessageProcessor-126"><a href="#MessageProcessor-126"><span class="linenos">126</span></a> <span class="c1"># increment trial</span>
</span><span id="MessageProcessor-127"><a href="#MessageProcessor-127"><span class="linenos">127</span></a> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">trial</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="MessageProcessor-128"><a href="#MessageProcessor-128"><span class="linenos">128</span></a>
</span><span id="MessageProcessor-129"><a href="#MessageProcessor-129"><span class="linenos">129</span></a> <span class="c1"># append current solution als old one</span>
</span><span id="MessageProcessor-130"><a href="#MessageProcessor-130"><span class="linenos">130</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">solution</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="MessageProcessor-131"><a href="#MessageProcessor-131"><span class="linenos">131</span></a> <span class="n">message</span><span class="o">.</span><span class="n">riddle</span><span class="o">.</span><span class="n">solutions_before</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="MessageProcessor-132"><a href="#MessageProcessor-132"><span class="linenos">132</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span>
</span><span id="MessageProcessor-133"><a href="#MessageProcessor-133"><span class="linenos">133</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-134"><a href="#MessageProcessor-134"><span class="linenos">134</span></a> <span class="c1"># reset current solution</span>
</span><span id="MessageProcessor-135"><a href="#MessageProcessor-135"><span class="linenos">135</span></a> <span class="n">message</span><span class="o">.</span><span class="n">solution</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="MessageProcessor-136"><a href="#MessageProcessor-136"><span class="linenos">136</span></a>
</span><span id="MessageProcessor-137"><a href="#MessageProcessor-137"><span class="linenos">137</span></a> <span class="c1"># add the riddle as new to management</span>
</span><span id="MessageProcessor-138"><a href="#MessageProcessor-138"><span class="linenos">138</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-139"><a href="#MessageProcessor-139"><span class="linenos">139</span></a>
</span><span id="MessageProcessor-140"><a href="#MessageProcessor-140"><span class="linenos">140</span></a> <span class="k">def</span> <span class="nf">_send_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipients</span><span class="p">:</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-141"><a href="#MessageProcessor-141"><span class="linenos">141</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="MessageProcessor-142"><a href="#MessageProcessor-142"><span class="linenos">142</span></a> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">recipients</span><span class="p">:</span>
</span><span id="MessageProcessor-143"><a href="#MessageProcessor-143"><span class="linenos">143</span></a> <span class="n">ok</span> <span class="o">=</span> <span class="n">ok</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_message</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor-144"><a href="#MessageProcessor-144"><span class="linenos">144</span></a> <span class="k">return</span> <span class="n">ok</span>
</span><span id="MessageProcessor-145"><a href="#MessageProcessor-145"><span class="linenos">145</span></a>
</span><span id="MessageProcessor-146"><a href="#MessageProcessor-146"><span class="linenos">146</span></a> <span class="k">def</span> <span class="nf">_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="MessageProcessor-147"><a href="#MessageProcessor-147"><span class="linenos">147</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span>
</span><span id="MessageProcessor-148"><a href="#MessageProcessor-148"><span class="linenos">148</span></a> <span class="n">sender</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">management_name</span><span class="p">,</span>
</span><span id="MessageProcessor-149"><a href="#MessageProcessor-149"><span class="linenos">149</span></a> <span class="n">recipient</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="MessageProcessor-150"><a href="#MessageProcessor-150"><span class="linenos">150</span></a> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span>
</span><span id="MessageProcessor-151"><a href="#MessageProcessor-151"><span class="linenos">151</span></a> <span class="n">processed</span><span class="o">=</span><span class="kc">False</span>
</span><span id="MessageProcessor-152"><a href="#MessageProcessor-152"><span class="linenos">152</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-153"><a href="#MessageProcessor-153"><span class="linenos">153</span></a>
</span><span id="MessageProcessor-154"><a href="#MessageProcessor-154"><span class="linenos">154</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="MessageProcessor-155"><a href="#MessageProcessor-155"><span class="linenos">155</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">recipient</span><span class="p">),</span>
</span><span id="MessageProcessor-156"><a href="#MessageProcessor-156"><span class="linenos">156</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="MessageProcessor-157"><a href="#MessageProcessor-157"><span class="linenos">157</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="MessageProcessor-158"><a href="#MessageProcessor-158"><span class="linenos">158</span></a> <span class="p">)</span>
</span><span id="MessageProcessor-159"><a href="#MessageProcessor-159"><span class="linenos">159</span></a>
</span><span id="MessageProcessor-160"><a href="#MessageProcessor-160"><span class="linenos">160</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="MessageProcessor-161"><a href="#MessageProcessor-161"><span class="linenos">161</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">set_processed</span><span class="p">(</span><span class="n">db_count</span><span class="p">,</span> <span class="n">processed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="MessageProcessor-162"><a href="#MessageProcessor-162"><span class="linenos">162</span></a> <span class="k">return</span> <span class="kc">True</span>
</span><span id="MessageProcessor-163"><a href="#MessageProcessor-163"><span class="linenos">163</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="MessageProcessor-164"><a href="#MessageProcessor-164"><span class="linenos">164</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending message to: </span><span class="si">{</span><span class="n">recipient</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor-165"><a href="#MessageProcessor-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="kc">False</span>
</span></pre></div>
@ -641,16 +426,16 @@
</div>
<a class="headerlink" href="#MessageProcessor.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor.__init__-44"><a href="#MessageProcessor.__init__-44"><span class="linenos">44</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">:</span><span class="n">DB</span><span class="p">):</span>
</span><span id="MessageProcessor.__init__-45"><a href="#MessageProcessor.__init__-45"><span class="linenos">45</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
</span><span id="MessageProcessor.__init__-46"><a href="#MessageProcessor.__init__-46"><span class="linenos">46</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">management_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-47"><a href="#MessageProcessor.__init__-47"><span class="linenos">47</span></a>
</span><span id="MessageProcessor.__init__-48"><a href="#MessageProcessor.__init__-48"><span class="linenos">48</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.__init__-49"><a href="#MessageProcessor.__init__-49"><span class="linenos">49</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Process Agent (AGENTS_PROCESS) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-50"><a href="#MessageProcessor.__init__-50"><span class="linenos">50</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.__init__-51"><a href="#MessageProcessor.__init__-51"><span class="linenos">51</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Solve Agent (AGENTS_SOLVE) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-52"><a href="#MessageProcessor.__init__-52"><span class="linenos">52</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.__init__-53"><a href="#MessageProcessor.__init__-53"><span class="linenos">53</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Gatekeeper Agent (AGENTS_GATEKEEPER) found, this may be a problem!&quot;</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor.__init__-40"><a href="#MessageProcessor.__init__-40"><span class="linenos">40</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">:</span><span class="n">DB</span><span class="p">):</span>
</span><span id="MessageProcessor.__init__-41"><a href="#MessageProcessor.__init__-41"><span class="linenos">41</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
</span><span id="MessageProcessor.__init__-42"><a href="#MessageProcessor.__init__-42"><span class="linenos">42</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">management_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-43"><a href="#MessageProcessor.__init__-43"><span class="linenos">43</span></a>
</span><span id="MessageProcessor.__init__-44"><a href="#MessageProcessor.__init__-44"><span class="linenos">44</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_PROCESS</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.__init__-45"><a href="#MessageProcessor.__init__-45"><span class="linenos">45</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Process Agent (AGENTS_PROCESS) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-46"><a href="#MessageProcessor.__init__-46"><span class="linenos">46</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_SOLVE</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.__init__-47"><a href="#MessageProcessor.__init__-47"><span class="linenos">47</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Solve Agent (AGENTS_SOLVE) found, this may be a problem!&quot;</span><span class="p">)</span>
</span><span id="MessageProcessor.__init__-48"><a href="#MessageProcessor.__init__-48"><span class="linenos">48</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AGENTS_GATEKEEPER</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="MessageProcessor.__init__-49"><a href="#MessageProcessor.__init__-49"><span class="linenos">49</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Not Gatekeeper Agent (AGENTS_GATEKEEPER) found, this may be a problem!&quot;</span><span class="p">)</span>
</span></pre></div>
@ -668,42 +453,6 @@
</div>
<div id="MessageProcessor.MESSAGE_MAX_CONTACTS" class="classattr">
<div class="attr variable">
<span class="name">MESSAGE_MAX_CONTACTS</span> =
<span class="default_value">100</span>
</div>
<a class="headerlink" href="#MessageProcessor.MESSAGE_MAX_CONTACTS"></a>
</div>
<div id="MessageProcessor.REQUIRE_FULL_EXTRACT" class="classattr">
<div class="attr variable">
<span class="name">REQUIRE_FULL_EXTRACT</span> =
<span class="default_value">False</span>
</div>
<a class="headerlink" href="#MessageProcessor.REQUIRE_FULL_EXTRACT"></a>
</div>
<div id="MessageProcessor.REQUIRE_FULL_SOLVE" class="classattr">
<div class="attr variable">
<span class="name">REQUIRE_FULL_SOLVE</span> =
<span class="default_value">False</span>
</div>
<a class="headerlink" href="#MessageProcessor.REQUIRE_FULL_SOLVE"></a>
</div>
<div id="MessageProcessor.MANAGEMENT_URL" class="classattr">
<div class="attr variable">
@ -786,25 +535,25 @@
</div>
<a class="headerlink" href="#MessageProcessor.new_message"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor.new_message-59"><a href="#MessageProcessor.new_message-59"><span class="linenos">59</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-60"><a href="#MessageProcessor.new_message-60"><span class="linenos">60</span></a> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">receiver</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-61"><a href="#MessageProcessor.new_message-61"><span class="linenos">61</span></a> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span>
</span><span id="MessageProcessor.new_message-62"><a href="#MessageProcessor.new_message-62"><span class="linenos">62</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="MessageProcessor.new_message-55"><a href="#MessageProcessor.new_message-55"><span class="linenos">55</span></a> <span class="k">def</span> <span class="nf">new_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-56"><a href="#MessageProcessor.new_message-56"><span class="linenos">56</span></a> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">receiver</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-57"><a href="#MessageProcessor.new_message-57"><span class="linenos">57</span></a> <span class="n">background_tasks</span><span class="p">:</span> <span class="n">BackgroundTasks</span>
</span><span id="MessageProcessor.new_message-58"><a href="#MessageProcessor.new_message-58"><span class="linenos">58</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-59"><a href="#MessageProcessor.new_message-59"><span class="linenos">59</span></a>
</span><span id="MessageProcessor.new_message-60"><a href="#MessageProcessor.new_message-60"><span class="linenos">60</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-61"><a href="#MessageProcessor.new_message-61"><span class="linenos">61</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-62"><a href="#MessageProcessor.new_message-62"><span class="linenos">62</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_process_message</span><span class="p">,</span> <span class="n">db_count</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-63"><a href="#MessageProcessor.new_message-63"><span class="linenos">63</span></a>
</span><span id="MessageProcessor.new_message-64"><a href="#MessageProcessor.new_message-64"><span class="linenos">64</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-65"><a href="#MessageProcessor.new_message-65"><span class="linenos">65</span></a> <span class="n">db_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">add_message</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-66"><a href="#MessageProcessor.new_message-66"><span class="linenos">66</span></a> <span class="n">background_tasks</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_process_message</span><span class="p">,</span> <span class="n">db_count</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-67"><a href="#MessageProcessor.new_message-67"><span class="linenos">67</span></a>
</span><span id="MessageProcessor.new_message-68"><a href="#MessageProcessor.new_message-68"><span class="linenos">68</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-69"><a href="#MessageProcessor.new_message-69"><span class="linenos">69</span></a> <span class="n">count</span><span class="o">=</span><span class="n">db_count</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-70"><a href="#MessageProcessor.new_message-70"><span class="linenos">70</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added message to queue&quot;</span>
</span><span id="MessageProcessor.new_message-71"><a href="#MessageProcessor.new_message-71"><span class="linenos">71</span></a> <span class="p">)</span>
</span><span id="MessageProcessor.new_message-72"><a href="#MessageProcessor.new_message-72"><span class="linenos">72</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-73"><a href="#MessageProcessor.new_message-73"><span class="linenos">73</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-74"><a href="#MessageProcessor.new_message-74"><span class="linenos">74</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-75"><a href="#MessageProcessor.new_message-75"><span class="linenos">75</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-76"><a href="#MessageProcessor.new_message-76"><span class="linenos">76</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-77"><a href="#MessageProcessor.new_message-77"><span class="linenos">77</span></a> <span class="p">)</span>
</span><span id="MessageProcessor.new_message-64"><a href="#MessageProcessor.new_message-64"><span class="linenos">64</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-65"><a href="#MessageProcessor.new_message-65"><span class="linenos">65</span></a> <span class="n">count</span><span class="o">=</span><span class="n">db_count</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-66"><a href="#MessageProcessor.new_message-66"><span class="linenos">66</span></a> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Added message to queue&quot;</span>
</span><span id="MessageProcessor.new_message-67"><a href="#MessageProcessor.new_message-67"><span class="linenos">67</span></a> <span class="p">)</span>
</span><span id="MessageProcessor.new_message-68"><a href="#MessageProcessor.new_message-68"><span class="linenos">68</span></a> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="MessageProcessor.new_message-69"><a href="#MessageProcessor.new_message-69"><span class="linenos">69</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="MessageProcessor.new_message-70"><a href="#MessageProcessor.new_message-70"><span class="linenos">70</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-71"><a href="#MessageProcessor.new_message-71"><span class="linenos">71</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="MessageProcessor.new_message-72"><a href="#MessageProcessor.new_message-72"><span class="linenos">72</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="MessageProcessor.new_message-73"><a href="#MessageProcessor.new_message-73"><span class="linenos">73</span></a> <span class="p">)</span>
</span></pre></div>

View File

@ -34,7 +34,6 @@
<li><a href="utils/const.html">const</a></li>
<li><a href="utils/functions.html">functions</a></li>
<li><a href="utils/request.html">request</a></li>
<li><a href="utils/schema.html">schema</a></li>
<li><a href="utils/types.html">types</a></li>
</ul>
@ -77,7 +76,7 @@
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">from</span> <span class="nn">ums.utils.const</span> <span class="kn">import</span> <span class="o">*</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="kn">import</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">os</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SERVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span><span class="p">:</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;SERVE&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span><span class="p">:</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a> <span class="n">handlers</span><span class="o">=</span><span class="p">[</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a> <span class="n">logging</span><span class="o">.</span><span class="n">FileHandler</span><span class="p">(</span><span class="n">LOG_FILE</span><span class="p">),</span>
@ -104,12 +103,6 @@
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a><span class="kn">from</span> <span class="nn">ums.utils.request</span> <span class="kn">import</span> <span class="n">ManagementRequest</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a><span class="kn">from</span> <span class="nn">ums.utils.functions</span> <span class="kn">import</span> <span class="n">list_shared_data</span><span class="p">,</span> <span class="n">list_shared_schema</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a><span class="kn">from</span> <span class="nn">ums.utils.schema</span> <span class="kn">import</span> <span class="p">(</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="n">ExtractionSchema</span><span class="p">,</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="n">ExtractedData</span><span class="p">,</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="n">ExtractedContent</span><span class="p">,</span> <span class="n">ExtractedPositions</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a><span class="p">)</span>
</span></pre></div>

View File

@ -45,16 +45,10 @@
<a class="function" href="#ManagementRequest.__init__">ManagementRequest</a>
</li>
<li>
<a class="variable" href="#ManagementRequest.MANAGEMENT_URL">MANAGEMENT_URL</a>
<a class="variable" href="#ManagementRequest.url">url</a>
</li>
<li>
<a class="function" href="#ManagementRequest.get_message">get_message</a>
</li>
<li>
<a class="function" href="#ManagementRequest.list_messages">list_messages</a>
</li>
<li>
<a class="function" href="#ManagementRequest.total_messages">total_messages</a>
<a class="function" href="#ManagementRequest.get_status">get_status</a>
</li>
<li>
<a class="function" href="#ManagementRequest.send_message">send_message</a>
@ -78,208 +72,56 @@
<h1 class="modulename">
<a href="./../../ums.html">ums</a><wbr>.<a href="./../utils.html">utils</a><wbr>.request </h1>
<div class="docstring"><p>Access to the management, e.g., get the list of messages and single messages.
Manually send messages (if necessary, the platforms should do this). </p>
<h3 id="example">Example</h3>
<div class="pdoc-code codehilite">
<pre><span></span><code> <span class="n">m_request</span> <span class="o">=</span> <span class="n">ManagementRequest</span><span class="p">()</span>
<span class="n">m_request</span><span class="o">.</span><span class="n">get_message</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="c1"># MessageDbRow(count=12 sender=&#39;from&#39; recipient=&#39;to&#39; ...</span>
<span class="n">m_request</span><span class="o">.</span><span class="n">list_messages</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s2">&quot;test&quot;</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># [</span>
<span class="c1"># MessageDbRow(count=7256, sender=&#39;management&#39;, ...),</span>
<span class="c1"># MessageDbRow(count=7255, sender=&#39;management&#39;, ...),</span>
<span class="c1"># ]</span>
<span class="n">m_request</span><span class="o">.</span><span class="n">total_messages</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s2">&quot;test&quot;</span><span class="p">)</span>
<span class="c1"># 31</span>
</code></pre>
</div>
<p>See also <code><a href="../example/__main__.html">ums.example.__main__</a></code> and run in Docker via <code>docker compose exec management python -m <a href="../example.html">ums.example</a></code></p>
</div>
<input id="mod-request-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-request-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1"># Agenten Plattform</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1">#</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1"># (c) 2024 Magnus Bender</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># Institute of Humanities-Centered Artificial Intelligence (CHAI)</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># Universitaet Hamburg</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># https://www.chai.uni-hamburg.de/~bender</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1"># </span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="sd"> Access to the management, e.g., get the list of messages and single messages.</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="sd"> Manually send messages (if necessary, the platforms should do this). </span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="sd"> ### Example</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="sd"> ```python</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="sd"> m_request = ManagementRequest()</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="sd"> </span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="sd"> m_request.get_message(count=12)</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="sd"> # MessageDbRow(count=12 sender=&#39;from&#39; recipient=&#39;to&#39; ...</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="sd"> m_request.list_messages(id=&quot;test&quot;, limit=2)</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd"> # [</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> # MessageDbRow(count=7256, sender=&#39;management&#39;, ...),</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> # MessageDbRow(count=7255, sender=&#39;management&#39;, ...),</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd"> # ]</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a><span class="sd"> m_request.total_messages(id=&quot;test&quot;)</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="sd"> # 31</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a><span class="sd"> ```</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="sd"> See also `ums.example.__main__` and run in Docker via ``docker compose exec management python -m ums.example``</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a><span class="kn">import</span> <span class="nn">os</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a><span class="kn">import</span> <span class="nn">requests</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a><span class="kn">from</span> <span class="nn">pydantic</span> <span class="kn">import</span> <span class="n">validate_call</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a><span class="kn">from</span> <span class="nn">ums.utils.types</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">MessageDbRow</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="k">class</span> <span class="nc">RequestException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a><span class="sd"> Raised on http and similar errors.</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="k">pass</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a><span class="k">class</span> <span class="nc">ManagementRequest</span><span class="p">():</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="nd">@validate_call</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a><span class="sd"> If `allow_lazy` is active, the type checking (by pydantic) is less strict. </span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a><span class="sd"> E.g. it does not require that all files in the data section of messages must exist on the file system.</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_allow_lazy</span> <span class="o">=</span> <span class="n">allow_lazy</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="s2">&quot;require_file_exists&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_allow_lazy</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="p">}</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="nd">@validate_call</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="k">def</span> <span class="nf">get_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a><span class="sd"> Get a message (like a table row) from the management by using the `count`.</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="s1">&#39;list/single&#39;</span><span class="p">,</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="p">{</span><span class="s2">&quot;count&quot;</span><span class="p">:</span> <span class="n">count</span><span class="p">}</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="p">)</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">row</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="p">)</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="nd">@validate_call</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">def</span> <span class="nf">list_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">]:</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="sd"> Get the rows in the tables as list of messages.</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a><span class="sd"> The arguments are used for filtering.</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">locals</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;self&#39;</span><span class="p">,)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span><span class="s1">&#39;list&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="k">return</span> <span class="p">[</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="n">row</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="p">)</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="p">]</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="nd">@validate_call</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="k">def</span> <span class="nf">total_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> Get the total number of rows in the tables matching the filters.</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">locals</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;self&#39;</span><span class="p">,)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span><span class="s1">&#39;app/table/total&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">))</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">def</span> <span class="nf">_get_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">params</span><span class="p">:</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]):</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">),</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="p">)</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">raise</span> <span class="n">RequestException</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="nd">@validate_call</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">def</span> <span class="nf">send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd"> Send the `message` to the management and return the management&#39;s agent response.</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="sd"> (On error an agent response with error message).</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_post_request</span><span class="p">(</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="s2">&quot;message&quot;</span><span class="p">,</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">()</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="p">)</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="p">)</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">except</span> <span class="n">RequestException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="p">)</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="k">def</span> <span class="nf">_post_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]):</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">),</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="p">)</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="k">return</span> <span class="n">RequestException</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="c1"># Agenten Plattform</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="c1">#</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="c1"># (c) 2024 Magnus Bender</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="c1"># Institute of Humanities-Centered Artificial Intelligence (CHAI)</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="c1"># Universitaet Hamburg</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="c1"># https://www.chai.uni-hamburg.de/~bender</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="c1"># </span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="c1"># source code released under the terms of GNU Public License Version 3</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="c1"># https://www.gnu.org/licenses/gpl-3.0.txt</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">import</span> <span class="nn">requests</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="kn">from</span> <span class="nn">ums.utils.types</span> <span class="kn">import</span> <span class="n">AgentMessage</span><span class="p">,</span> <span class="n">AgentResponse</span><span class="p">,</span> <span class="n">MessageDbRow</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="k">class</span> <span class="nc">RequestException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a> <span class="k">pass</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="k">class</span> <span class="nc">ManagementRequest</span><span class="p">():</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">80</span><span class="p">):</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;http://</span><span class="si">{hostname}</span><span class="s2">:</span><span class="si">{port}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hostname</span><span class="o">=</span><span class="n">hostname</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="n">port</span><span class="p">)</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a> <span class="k">def</span> <span class="nf">get_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/status&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url</span><span class="p">),</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;count&quot;</span><span class="p">:</span> <span class="n">count</span><span class="p">}</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a> <span class="p">)</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="k">raise</span> <span class="n">RequestException</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="k">def</span> <span class="nf">send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url</span><span class="p">),</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="p">)</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span><span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span></pre></div>
@ -295,15 +137,12 @@ Manually send messages (if necessary, the platforms should do this). </p>
</div>
<a class="headerlink" href="#RequestException"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="RequestException-47"><a href="#RequestException-47"><span class="linenos">47</span></a><span class="k">class</span> <span class="nc">RequestException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
</span><span id="RequestException-48"><a href="#RequestException-48"><span class="linenos">48</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="RequestException-49"><a href="#RequestException-49"><span class="linenos">49</span></a><span class="sd"> Raised on http and similar errors.</span>
</span><span id="RequestException-50"><a href="#RequestException-50"><span class="linenos">50</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="RequestException-51"><a href="#RequestException-51"><span class="linenos">51</span></a> <span class="k">pass</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="RequestException-16"><a href="#RequestException-16"><span class="linenos">16</span></a><span class="k">class</span> <span class="nc">RequestException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
</span><span id="RequestException-17"><a href="#RequestException-17"><span class="linenos">17</span></a> <span class="k">pass</span>
</span></pre></div>
<div class="docstring"><p>Raised on http and similar errors.</p>
<div class="docstring"><p>Common base class for all non-exit exceptions.</p>
</div>
@ -334,128 +173,34 @@ Manually send messages (if necessary, the platforms should do this). </p>
</div>
<a class="headerlink" href="#ManagementRequest"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest-53"><a href="#ManagementRequest-53"><span class="linenos"> 53</span></a><span class="k">class</span> <span class="nc">ManagementRequest</span><span class="p">():</span>
</span><span id="ManagementRequest-54"><a href="#ManagementRequest-54"><span class="linenos"> 54</span></a>
</span><span id="ManagementRequest-55"><a href="#ManagementRequest-55"><span class="linenos"> 55</span></a> <span class="n">MANAGEMENT_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MANAGEMENT_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://127.0.0.1:80&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
</span><span id="ManagementRequest-56"><a href="#ManagementRequest-56"><span class="linenos"> 56</span></a>
</span><span id="ManagementRequest-57"><a href="#ManagementRequest-57"><span class="linenos"> 57</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest-58"><a href="#ManagementRequest-58"><span class="linenos"> 58</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="ManagementRequest-59"><a href="#ManagementRequest-59"><span class="linenos"> 59</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest-60"><a href="#ManagementRequest-60"><span class="linenos"> 60</span></a><span class="sd"> If `allow_lazy` is active, the type checking (by pydantic) is less strict. </span>
</span><span id="ManagementRequest-61"><a href="#ManagementRequest-61"><span class="linenos"> 61</span></a><span class="sd"> E.g. it does not require that all files in the data section of messages must exist on the file system.</span>
</span><span id="ManagementRequest-62"><a href="#ManagementRequest-62"><span class="linenos"> 62</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest-63"><a href="#ManagementRequest-63"><span class="linenos"> 63</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_allow_lazy</span> <span class="o">=</span> <span class="n">allow_lazy</span>
</span><span id="ManagementRequest-64"><a href="#ManagementRequest-64"><span class="linenos"> 64</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="ManagementRequest-65"><a href="#ManagementRequest-65"><span class="linenos"> 65</span></a> <span class="s2">&quot;require_file_exists&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_allow_lazy</span>
</span><span id="ManagementRequest-66"><a href="#ManagementRequest-66"><span class="linenos"> 66</span></a> <span class="p">}</span>
</span><span id="ManagementRequest-67"><a href="#ManagementRequest-67"><span class="linenos"> 67</span></a>
</span><span id="ManagementRequest-68"><a href="#ManagementRequest-68"><span class="linenos"> 68</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest-69"><a href="#ManagementRequest-69"><span class="linenos"> 69</span></a> <span class="k">def</span> <span class="nf">get_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="ManagementRequest-70"><a href="#ManagementRequest-70"><span class="linenos"> 70</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest-71"><a href="#ManagementRequest-71"><span class="linenos"> 71</span></a><span class="sd"> Get a message (like a table row) from the management by using the `count`.</span>
</span><span id="ManagementRequest-72"><a href="#ManagementRequest-72"><span class="linenos"> 72</span></a>
</span><span id="ManagementRequest-73"><a href="#ManagementRequest-73"><span class="linenos"> 73</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="ManagementRequest-74"><a href="#ManagementRequest-74"><span class="linenos"> 74</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest-75"><a href="#ManagementRequest-75"><span class="linenos"> 75</span></a> <span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span>
</span><span id="ManagementRequest-76"><a href="#ManagementRequest-76"><span class="linenos"> 76</span></a> <span class="s1">&#39;list/single&#39;</span><span class="p">,</span>
</span><span id="ManagementRequest-77"><a href="#ManagementRequest-77"><span class="linenos"> 77</span></a> <span class="p">{</span><span class="s2">&quot;count&quot;</span><span class="p">:</span> <span class="n">count</span><span class="p">}</span>
</span><span id="ManagementRequest-78"><a href="#ManagementRequest-78"><span class="linenos"> 78</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-79"><a href="#ManagementRequest-79"><span class="linenos"> 79</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="ManagementRequest-80"><a href="#ManagementRequest-80"><span class="linenos"> 80</span></a> <span class="n">row</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span>
</span><span id="ManagementRequest-81"><a href="#ManagementRequest-81"><span class="linenos"> 81</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-82"><a href="#ManagementRequest-82"><span class="linenos"> 82</span></a>
</span><span id="ManagementRequest-83"><a href="#ManagementRequest-83"><span class="linenos"> 83</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest-84"><a href="#ManagementRequest-84"><span class="linenos"> 84</span></a> <span class="k">def</span> <span class="nf">list_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="ManagementRequest-85"><a href="#ManagementRequest-85"><span class="linenos"> 85</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest-86"><a href="#ManagementRequest-86"><span class="linenos"> 86</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest-87"><a href="#ManagementRequest-87"><span class="linenos"> 87</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest-88"><a href="#ManagementRequest-88"><span class="linenos"> 88</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span>
</span><span id="ManagementRequest-89"><a href="#ManagementRequest-89"><span class="linenos"> 89</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">]:</span>
</span><span id="ManagementRequest-90"><a href="#ManagementRequest-90"><span class="linenos"> 90</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest-91"><a href="#ManagementRequest-91"><span class="linenos"> 91</span></a><span class="sd"> Get the rows in the tables as list of messages.</span>
</span><span id="ManagementRequest-92"><a href="#ManagementRequest-92"><span class="linenos"> 92</span></a><span class="sd"> The arguments are used for filtering.</span>
</span><span id="ManagementRequest-93"><a href="#ManagementRequest-93"><span class="linenos"> 93</span></a>
</span><span id="ManagementRequest-94"><a href="#ManagementRequest-94"><span class="linenos"> 94</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="ManagementRequest-95"><a href="#ManagementRequest-95"><span class="linenos"> 95</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest-96"><a href="#ManagementRequest-96"><span class="linenos"> 96</span></a>
</span><span id="ManagementRequest-97"><a href="#ManagementRequest-97"><span class="linenos"> 97</span></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">locals</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="ManagementRequest-98"><a href="#ManagementRequest-98"><span class="linenos"> 98</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="ManagementRequest-99"><a href="#ManagementRequest-99"><span class="linenos"> 99</span></a>
</span><span id="ManagementRequest-100"><a href="#ManagementRequest-100"><span class="linenos">100</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="ManagementRequest-101"><a href="#ManagementRequest-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;self&#39;</span><span class="p">,)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ManagementRequest-102"><a href="#ManagementRequest-102"><span class="linenos">102</span></a> <span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="ManagementRequest-103"><a href="#ManagementRequest-103"><span class="linenos">103</span></a>
</span><span id="ManagementRequest-104"><a href="#ManagementRequest-104"><span class="linenos">104</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span><span class="s1">&#39;list&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
</span><span id="ManagementRequest-105"><a href="#ManagementRequest-105"><span class="linenos">105</span></a>
</span><span id="ManagementRequest-106"><a href="#ManagementRequest-106"><span class="linenos">106</span></a> <span class="k">return</span> <span class="p">[</span>
</span><span id="ManagementRequest-107"><a href="#ManagementRequest-107"><span class="linenos">107</span></a> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="ManagementRequest-108"><a href="#ManagementRequest-108"><span class="linenos">108</span></a> <span class="n">row</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span>
</span><span id="ManagementRequest-109"><a href="#ManagementRequest-109"><span class="linenos">109</span></a> <span class="p">)</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span>
</span><span id="ManagementRequest-110"><a href="#ManagementRequest-110"><span class="linenos">110</span></a> <span class="p">]</span>
</span><span id="ManagementRequest-111"><a href="#ManagementRequest-111"><span class="linenos">111</span></a>
</span><span id="ManagementRequest-112"><a href="#ManagementRequest-112"><span class="linenos">112</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest-113"><a href="#ManagementRequest-113"><span class="linenos">113</span></a> <span class="k">def</span> <span class="nf">total_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="ManagementRequest-114"><a href="#ManagementRequest-114"><span class="linenos">114</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest-115"><a href="#ManagementRequest-115"><span class="linenos">115</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest-116"><a href="#ManagementRequest-116"><span class="linenos">116</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span>
</span><span id="ManagementRequest-117"><a href="#ManagementRequest-117"><span class="linenos">117</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="ManagementRequest-118"><a href="#ManagementRequest-118"><span class="linenos">118</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest-119"><a href="#ManagementRequest-119"><span class="linenos">119</span></a><span class="sd"> Get the total number of rows in the tables matching the filters.</span>
</span><span id="ManagementRequest-120"><a href="#ManagementRequest-120"><span class="linenos">120</span></a>
</span><span id="ManagementRequest-121"><a href="#ManagementRequest-121"><span class="linenos">121</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="ManagementRequest-122"><a href="#ManagementRequest-122"><span class="linenos">122</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest-123"><a href="#ManagementRequest-123"><span class="linenos">123</span></a>
</span><span id="ManagementRequest-124"><a href="#ManagementRequest-124"><span class="linenos">124</span></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">locals</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="ManagementRequest-125"><a href="#ManagementRequest-125"><span class="linenos">125</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="ManagementRequest-126"><a href="#ManagementRequest-126"><span class="linenos">126</span></a>
</span><span id="ManagementRequest-127"><a href="#ManagementRequest-127"><span class="linenos">127</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="ManagementRequest-128"><a href="#ManagementRequest-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;self&#39;</span><span class="p">,)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ManagementRequest-129"><a href="#ManagementRequest-129"><span class="linenos">129</span></a> <span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="ManagementRequest-130"><a href="#ManagementRequest-130"><span class="linenos">130</span></a>
</span><span id="ManagementRequest-131"><a href="#ManagementRequest-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span><span class="s1">&#39;app/table/total&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">))</span>
</span><span id="ManagementRequest-132"><a href="#ManagementRequest-132"><span class="linenos">132</span></a>
</span><span id="ManagementRequest-133"><a href="#ManagementRequest-133"><span class="linenos">133</span></a> <span class="k">def</span> <span class="nf">_get_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">params</span><span class="p">:</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]):</span>
</span><span id="ManagementRequest-134"><a href="#ManagementRequest-134"><span class="linenos">134</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="ManagementRequest-135"><a href="#ManagementRequest-135"><span class="linenos">135</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">),</span>
</span><span id="ManagementRequest-136"><a href="#ManagementRequest-136"><span class="linenos">136</span></a> <span class="n">params</span><span class="o">=</span><span class="n">params</span>
</span><span id="ManagementRequest-137"><a href="#ManagementRequest-137"><span class="linenos">137</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-138"><a href="#ManagementRequest-138"><span class="linenos">138</span></a>
</span><span id="ManagementRequest-139"><a href="#ManagementRequest-139"><span class="linenos">139</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="ManagementRequest-140"><a href="#ManagementRequest-140"><span class="linenos">140</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="ManagementRequest-141"><a href="#ManagementRequest-141"><span class="linenos">141</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="ManagementRequest-142"><a href="#ManagementRequest-142"><span class="linenos">142</span></a> <span class="k">raise</span> <span class="n">RequestException</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span><span id="ManagementRequest-143"><a href="#ManagementRequest-143"><span class="linenos">143</span></a>
</span><span id="ManagementRequest-144"><a href="#ManagementRequest-144"><span class="linenos">144</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest-145"><a href="#ManagementRequest-145"><span class="linenos">145</span></a> <span class="k">def</span> <span class="nf">send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="ManagementRequest-146"><a href="#ManagementRequest-146"><span class="linenos">146</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest-147"><a href="#ManagementRequest-147"><span class="linenos">147</span></a><span class="sd"> Send the `message` to the management and return the management&#39;s agent response.</span>
</span><span id="ManagementRequest-148"><a href="#ManagementRequest-148"><span class="linenos">148</span></a><span class="sd"> (On error an agent response with error message).</span>
</span><span id="ManagementRequest-149"><a href="#ManagementRequest-149"><span class="linenos">149</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest-150"><a href="#ManagementRequest-150"><span class="linenos">150</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="ManagementRequest-151"><a href="#ManagementRequest-151"><span class="linenos">151</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="ManagementRequest-152"><a href="#ManagementRequest-152"><span class="linenos">152</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_post_request</span><span class="p">(</span>
</span><span id="ManagementRequest-153"><a href="#ManagementRequest-153"><span class="linenos">153</span></a> <span class="s2">&quot;message&quot;</span><span class="p">,</span>
</span><span id="ManagementRequest-154"><a href="#ManagementRequest-154"><span class="linenos">154</span></a> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">()</span>
</span><span id="ManagementRequest-155"><a href="#ManagementRequest-155"><span class="linenos">155</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-156"><a href="#ManagementRequest-156"><span class="linenos">156</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-157"><a href="#ManagementRequest-157"><span class="linenos">157</span></a> <span class="k">except</span> <span class="n">RequestException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="ManagementRequest-158"><a href="#ManagementRequest-158"><span class="linenos">158</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="ManagementRequest-159"><a href="#ManagementRequest-159"><span class="linenos">159</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="ManagementRequest-160"><a href="#ManagementRequest-160"><span class="linenos">160</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="ManagementRequest-161"><a href="#ManagementRequest-161"><span class="linenos">161</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="ManagementRequest-162"><a href="#ManagementRequest-162"><span class="linenos">162</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-163"><a href="#ManagementRequest-163"><span class="linenos">163</span></a>
</span><span id="ManagementRequest-164"><a href="#ManagementRequest-164"><span class="linenos">164</span></a> <span class="k">def</span> <span class="nf">_post_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]):</span>
</span><span id="ManagementRequest-165"><a href="#ManagementRequest-165"><span class="linenos">165</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="ManagementRequest-166"><a href="#ManagementRequest-166"><span class="linenos">166</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MANAGEMENT_URL</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">),</span>
</span><span id="ManagementRequest-167"><a href="#ManagementRequest-167"><span class="linenos">167</span></a> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span>
</span><span id="ManagementRequest-168"><a href="#ManagementRequest-168"><span class="linenos">168</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="ManagementRequest-169"><a href="#ManagementRequest-169"><span class="linenos">169</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-170"><a href="#ManagementRequest-170"><span class="linenos">170</span></a>
</span><span id="ManagementRequest-171"><a href="#ManagementRequest-171"><span class="linenos">171</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="ManagementRequest-172"><a href="#ManagementRequest-172"><span class="linenos">172</span></a> <span class="k">return</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="ManagementRequest-173"><a href="#ManagementRequest-173"><span class="linenos">173</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="ManagementRequest-174"><a href="#ManagementRequest-174"><span class="linenos">174</span></a> <span class="k">return</span> <span class="n">RequestException</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest-19"><a href="#ManagementRequest-19"><span class="linenos">19</span></a><span class="k">class</span> <span class="nc">ManagementRequest</span><span class="p">():</span>
</span><span id="ManagementRequest-20"><a href="#ManagementRequest-20"><span class="linenos">20</span></a>
</span><span id="ManagementRequest-21"><a href="#ManagementRequest-21"><span class="linenos">21</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">80</span><span class="p">):</span>
</span><span id="ManagementRequest-22"><a href="#ManagementRequest-22"><span class="linenos">22</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;http://</span><span class="si">{hostname}</span><span class="s2">:</span><span class="si">{port}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hostname</span><span class="o">=</span><span class="n">hostname</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="n">port</span><span class="p">)</span>
</span><span id="ManagementRequest-23"><a href="#ManagementRequest-23"><span class="linenos">23</span></a>
</span><span id="ManagementRequest-24"><a href="#ManagementRequest-24"><span class="linenos">24</span></a> <span class="k">def</span> <span class="nf">get_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="ManagementRequest-25"><a href="#ManagementRequest-25"><span class="linenos">25</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="ManagementRequest-26"><a href="#ManagementRequest-26"><span class="linenos">26</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/status&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url</span><span class="p">),</span>
</span><span id="ManagementRequest-27"><a href="#ManagementRequest-27"><span class="linenos">27</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;count&quot;</span><span class="p">:</span> <span class="n">count</span><span class="p">}</span>
</span><span id="ManagementRequest-28"><a href="#ManagementRequest-28"><span class="linenos">28</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-29"><a href="#ManagementRequest-29"><span class="linenos">29</span></a>
</span><span id="ManagementRequest-30"><a href="#ManagementRequest-30"><span class="linenos">30</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="ManagementRequest-31"><a href="#ManagementRequest-31"><span class="linenos">31</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span><span id="ManagementRequest-32"><a href="#ManagementRequest-32"><span class="linenos">32</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="ManagementRequest-33"><a href="#ManagementRequest-33"><span class="linenos">33</span></a> <span class="k">raise</span> <span class="n">RequestException</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span><span id="ManagementRequest-34"><a href="#ManagementRequest-34"><span class="linenos">34</span></a>
</span><span id="ManagementRequest-35"><a href="#ManagementRequest-35"><span class="linenos">35</span></a>
</span><span id="ManagementRequest-36"><a href="#ManagementRequest-36"><span class="linenos">36</span></a> <span class="k">def</span> <span class="nf">send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="ManagementRequest-37"><a href="#ManagementRequest-37"><span class="linenos">37</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="ManagementRequest-38"><a href="#ManagementRequest-38"><span class="linenos">38</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url</span><span class="p">),</span>
</span><span id="ManagementRequest-39"><a href="#ManagementRequest-39"><span class="linenos">39</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="ManagementRequest-40"><a href="#ManagementRequest-40"><span class="linenos">40</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="ManagementRequest-41"><a href="#ManagementRequest-41"><span class="linenos">41</span></a> <span class="p">)</span>
</span><span id="ManagementRequest-42"><a href="#ManagementRequest-42"><span class="linenos">42</span></a>
</span><span id="ManagementRequest-43"><a href="#ManagementRequest-43"><span class="linenos">43</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="ManagementRequest-44"><a href="#ManagementRequest-44"><span class="linenos">44</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span><span id="ManagementRequest-45"><a href="#ManagementRequest-45"><span class="linenos">45</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="ManagementRequest-46"><a href="#ManagementRequest-46"><span class="linenos">46</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span><span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span></pre></div>
@ -464,178 +209,62 @@ Manually send messages (if necessary, the platforms should do this). </p>
<div id="ManagementRequest.__init__" class="classattr">
<input id="ManagementRequest.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator">@validate_call</div>
<span class="name">ManagementRequest</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">allow_lazy</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span></span>)</span>
<span class="name">ManagementRequest</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">hostname</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">port</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">80</span></span>)</span>
<label class="view-source-button" for="ManagementRequest.__init__-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ManagementRequest.__init__"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.__init__-57"><a href="#ManagementRequest.__init__-57"><span class="linenos">57</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest.__init__-58"><a href="#ManagementRequest.__init__-58"><span class="linenos">58</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">allow_lazy</span><span class="p">:</span><span class="nb">bool</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="ManagementRequest.__init__-59"><a href="#ManagementRequest.__init__-59"><span class="linenos">59</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest.__init__-60"><a href="#ManagementRequest.__init__-60"><span class="linenos">60</span></a><span class="sd"> If `allow_lazy` is active, the type checking (by pydantic) is less strict. </span>
</span><span id="ManagementRequest.__init__-61"><a href="#ManagementRequest.__init__-61"><span class="linenos">61</span></a><span class="sd"> E.g. it does not require that all files in the data section of messages must exist on the file system.</span>
</span><span id="ManagementRequest.__init__-62"><a href="#ManagementRequest.__init__-62"><span class="linenos">62</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest.__init__-63"><a href="#ManagementRequest.__init__-63"><span class="linenos">63</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_allow_lazy</span> <span class="o">=</span> <span class="n">allow_lazy</span>
</span><span id="ManagementRequest.__init__-64"><a href="#ManagementRequest.__init__-64"><span class="linenos">64</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="ManagementRequest.__init__-65"><a href="#ManagementRequest.__init__-65"><span class="linenos">65</span></a> <span class="s2">&quot;require_file_exists&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_allow_lazy</span>
</span><span id="ManagementRequest.__init__-66"><a href="#ManagementRequest.__init__-66"><span class="linenos">66</span></a> <span class="p">}</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.__init__-21"><a href="#ManagementRequest.__init__-21"><span class="linenos">21</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">80</span><span class="p">):</span>
</span><span id="ManagementRequest.__init__-22"><a href="#ManagementRequest.__init__-22"><span class="linenos">22</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;http://</span><span class="si">{hostname}</span><span class="s2">:</span><span class="si">{port}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hostname</span><span class="o">=</span><span class="n">hostname</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="n">port</span><span class="p">)</span>
</span></pre></div>
<div class="docstring"><p>If <code>allow_lazy</code> is active, the type checking (by pydantic) is less strict.
E.g. it does not require that all files in the data section of messages must exist on the file system.</p>
</div>
</div>
<div id="ManagementRequest.MANAGEMENT_URL" class="classattr">
<div id="ManagementRequest.url" class="classattr">
<div class="attr variable">
<span class="name">MANAGEMENT_URL</span> =
<span class="default_value">&#39;http://127.0.0.1:80&#39;</span>
<span class="name">url</span>
</div>
<a class="headerlink" href="#ManagementRequest.MANAGEMENT_URL"></a>
<a class="headerlink" href="#ManagementRequest.url"></a>
</div>
<div id="ManagementRequest.get_message" class="classattr">
<input id="ManagementRequest.get_message-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div id="ManagementRequest.get_status" class="classattr">
<input id="ManagementRequest.get_status-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator">@validate_call</div>
<span class="def">def</span>
<span class="name">get_message</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">count</span><span class="p">:</span> <span class="nb">int</span></span><span class="return-annotation">) -> <span class="n"><a href="types.html#MessageDbRow">ums.utils.types.MessageDbRow</a></span>:</span></span>
<span class="name">get_status</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">count</span><span class="p">:</span> <span class="nb">int</span></span><span class="return-annotation">) -> <span class="n"><a href="types.html#MessageDbRow">ums.utils.types.MessageDbRow</a></span>:</span></span>
<label class="view-source-button" for="ManagementRequest.get_message-view-source"><span>View Source</span></label>
<label class="view-source-button" for="ManagementRequest.get_status-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ManagementRequest.get_message"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.get_message-68"><a href="#ManagementRequest.get_message-68"><span class="linenos">68</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest.get_message-69"><a href="#ManagementRequest.get_message-69"><span class="linenos">69</span></a> <span class="k">def</span> <span class="nf">get_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="ManagementRequest.get_message-70"><a href="#ManagementRequest.get_message-70"><span class="linenos">70</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest.get_message-71"><a href="#ManagementRequest.get_message-71"><span class="linenos">71</span></a><span class="sd"> Get a message (like a table row) from the management by using the `count`.</span>
</span><span id="ManagementRequest.get_message-72"><a href="#ManagementRequest.get_message-72"><span class="linenos">72</span></a>
</span><span id="ManagementRequest.get_message-73"><a href="#ManagementRequest.get_message-73"><span class="linenos">73</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="ManagementRequest.get_message-74"><a href="#ManagementRequest.get_message-74"><span class="linenos">74</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest.get_message-75"><a href="#ManagementRequest.get_message-75"><span class="linenos">75</span></a> <span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span>
</span><span id="ManagementRequest.get_message-76"><a href="#ManagementRequest.get_message-76"><span class="linenos">76</span></a> <span class="s1">&#39;list/single&#39;</span><span class="p">,</span>
</span><span id="ManagementRequest.get_message-77"><a href="#ManagementRequest.get_message-77"><span class="linenos">77</span></a> <span class="p">{</span><span class="s2">&quot;count&quot;</span><span class="p">:</span> <span class="n">count</span><span class="p">}</span>
</span><span id="ManagementRequest.get_message-78"><a href="#ManagementRequest.get_message-78"><span class="linenos">78</span></a> <span class="p">)</span>
</span><span id="ManagementRequest.get_message-79"><a href="#ManagementRequest.get_message-79"><span class="linenos">79</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="ManagementRequest.get_message-80"><a href="#ManagementRequest.get_message-80"><span class="linenos">80</span></a> <span class="n">row</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span>
</span><span id="ManagementRequest.get_message-81"><a href="#ManagementRequest.get_message-81"><span class="linenos">81</span></a> <span class="p">)</span>
<a class="headerlink" href="#ManagementRequest.get_status"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.get_status-24"><a href="#ManagementRequest.get_status-24"><span class="linenos">24</span></a> <span class="k">def</span> <span class="nf">get_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">:</span><span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">MessageDbRow</span><span class="p">:</span>
</span><span id="ManagementRequest.get_status-25"><a href="#ManagementRequest.get_status-25"><span class="linenos">25</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="ManagementRequest.get_status-26"><a href="#ManagementRequest.get_status-26"><span class="linenos">26</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/status&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url</span><span class="p">),</span>
</span><span id="ManagementRequest.get_status-27"><a href="#ManagementRequest.get_status-27"><span class="linenos">27</span></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;count&quot;</span><span class="p">:</span> <span class="n">count</span><span class="p">}</span>
</span><span id="ManagementRequest.get_status-28"><a href="#ManagementRequest.get_status-28"><span class="linenos">28</span></a> <span class="p">)</span>
</span><span id="ManagementRequest.get_status-29"><a href="#ManagementRequest.get_status-29"><span class="linenos">29</span></a>
</span><span id="ManagementRequest.get_status-30"><a href="#ManagementRequest.get_status-30"><span class="linenos">30</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="ManagementRequest.get_status-31"><a href="#ManagementRequest.get_status-31"><span class="linenos">31</span></a> <span class="k">return</span> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span><span id="ManagementRequest.get_status-32"><a href="#ManagementRequest.get_status-32"><span class="linenos">32</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="ManagementRequest.get_status-33"><a href="#ManagementRequest.get_status-33"><span class="linenos">33</span></a> <span class="k">raise</span> <span class="n">RequestException</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span></pre></div>
<div class="docstring"><p>Get a message (like a table row) from the management by using the <code>count</code>.</p>
<p>May raise <code><a href="#RequestException">RequestException</a></code>.</p>
</div>
</div>
<div id="ManagementRequest.list_messages" class="classattr">
<input id="ManagementRequest.list_messages-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator">@validate_call</div>
<span class="def">def</span>
<span class="name">list_messages</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="nb">id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">sender</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">recipient</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">processed</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">solution</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">time_after</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">time_before</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">limit</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">10</span>,</span><span class="param"> <span class="n">offset</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="n"><a href="types.html#MessageDbRow">ums.utils.types.MessageDbRow</a></span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="ManagementRequest.list_messages-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ManagementRequest.list_messages"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.list_messages-83"><a href="#ManagementRequest.list_messages-83"><span class="linenos"> 83</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest.list_messages-84"><a href="#ManagementRequest.list_messages-84"><span class="linenos"> 84</span></a> <span class="k">def</span> <span class="nf">list_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="ManagementRequest.list_messages-85"><a href="#ManagementRequest.list_messages-85"><span class="linenos"> 85</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest.list_messages-86"><a href="#ManagementRequest.list_messages-86"><span class="linenos"> 86</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest.list_messages-87"><a href="#ManagementRequest.list_messages-87"><span class="linenos"> 87</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest.list_messages-88"><a href="#ManagementRequest.list_messages-88"><span class="linenos"> 88</span></a> <span class="n">limit</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">offset</span><span class="p">:</span><span class="nb">int</span><span class="o">=</span><span class="mi">0</span>
</span><span id="ManagementRequest.list_messages-89"><a href="#ManagementRequest.list_messages-89"><span class="linenos"> 89</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">MessageDbRow</span><span class="p">]:</span>
</span><span id="ManagementRequest.list_messages-90"><a href="#ManagementRequest.list_messages-90"><span class="linenos"> 90</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest.list_messages-91"><a href="#ManagementRequest.list_messages-91"><span class="linenos"> 91</span></a><span class="sd"> Get the rows in the tables as list of messages.</span>
</span><span id="ManagementRequest.list_messages-92"><a href="#ManagementRequest.list_messages-92"><span class="linenos"> 92</span></a><span class="sd"> The arguments are used for filtering.</span>
</span><span id="ManagementRequest.list_messages-93"><a href="#ManagementRequest.list_messages-93"><span class="linenos"> 93</span></a>
</span><span id="ManagementRequest.list_messages-94"><a href="#ManagementRequest.list_messages-94"><span class="linenos"> 94</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="ManagementRequest.list_messages-95"><a href="#ManagementRequest.list_messages-95"><span class="linenos"> 95</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest.list_messages-96"><a href="#ManagementRequest.list_messages-96"><span class="linenos"> 96</span></a>
</span><span id="ManagementRequest.list_messages-97"><a href="#ManagementRequest.list_messages-97"><span class="linenos"> 97</span></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">locals</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="ManagementRequest.list_messages-98"><a href="#ManagementRequest.list_messages-98"><span class="linenos"> 98</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="ManagementRequest.list_messages-99"><a href="#ManagementRequest.list_messages-99"><span class="linenos"> 99</span></a>
</span><span id="ManagementRequest.list_messages-100"><a href="#ManagementRequest.list_messages-100"><span class="linenos">100</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="ManagementRequest.list_messages-101"><a href="#ManagementRequest.list_messages-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;self&#39;</span><span class="p">,)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ManagementRequest.list_messages-102"><a href="#ManagementRequest.list_messages-102"><span class="linenos">102</span></a> <span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="ManagementRequest.list_messages-103"><a href="#ManagementRequest.list_messages-103"><span class="linenos">103</span></a>
</span><span id="ManagementRequest.list_messages-104"><a href="#ManagementRequest.list_messages-104"><span class="linenos">104</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span><span class="s1">&#39;list&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
</span><span id="ManagementRequest.list_messages-105"><a href="#ManagementRequest.list_messages-105"><span class="linenos">105</span></a>
</span><span id="ManagementRequest.list_messages-106"><a href="#ManagementRequest.list_messages-106"><span class="linenos">106</span></a> <span class="k">return</span> <span class="p">[</span>
</span><span id="ManagementRequest.list_messages-107"><a href="#ManagementRequest.list_messages-107"><span class="linenos">107</span></a> <span class="n">MessageDbRow</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="ManagementRequest.list_messages-108"><a href="#ManagementRequest.list_messages-108"><span class="linenos">108</span></a> <span class="n">row</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_pydantic_context</span>
</span><span id="ManagementRequest.list_messages-109"><a href="#ManagementRequest.list_messages-109"><span class="linenos">109</span></a> <span class="p">)</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span>
</span><span id="ManagementRequest.list_messages-110"><a href="#ManagementRequest.list_messages-110"><span class="linenos">110</span></a> <span class="p">]</span>
</span></pre></div>
<div class="docstring"><p>Get the rows in the tables as list of messages.
The arguments are used for filtering.</p>
<p>May raise <code><a href="#RequestException">RequestException</a></code>.</p>
</div>
</div>
<div id="ManagementRequest.total_messages" class="classattr">
<input id="ManagementRequest.total_messages-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator">@validate_call</div>
<span class="def">def</span>
<span class="name">total_messages</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="nb">id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">sender</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">recipient</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">processed</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">solution</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">time_after</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">time_before</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="nb">int</span>:</span></span>
<label class="view-source-button" for="ManagementRequest.total_messages-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ManagementRequest.total_messages"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.total_messages-112"><a href="#ManagementRequest.total_messages-112"><span class="linenos">112</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest.total_messages-113"><a href="#ManagementRequest.total_messages-113"><span class="linenos">113</span></a> <span class="k">def</span> <span class="nf">total_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
</span><span id="ManagementRequest.total_messages-114"><a href="#ManagementRequest.total_messages-114"><span class="linenos">114</span></a> <span class="nb">id</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sender</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">recipient</span><span class="p">:</span><span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest.total_messages-115"><a href="#ManagementRequest.total_messages-115"><span class="linenos">115</span></a> <span class="n">processed</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solution</span><span class="p">:</span><span class="nb">bool</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="ManagementRequest.total_messages-116"><a href="#ManagementRequest.total_messages-116"><span class="linenos">116</span></a> <span class="n">time_after</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">time_before</span><span class="p">:</span><span class="nb">int</span><span class="o">|</span><span class="kc">None</span><span class="o">=</span><span class="kc">None</span>
</span><span id="ManagementRequest.total_messages-117"><a href="#ManagementRequest.total_messages-117"><span class="linenos">117</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="ManagementRequest.total_messages-118"><a href="#ManagementRequest.total_messages-118"><span class="linenos">118</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest.total_messages-119"><a href="#ManagementRequest.total_messages-119"><span class="linenos">119</span></a><span class="sd"> Get the total number of rows in the tables matching the filters.</span>
</span><span id="ManagementRequest.total_messages-120"><a href="#ManagementRequest.total_messages-120"><span class="linenos">120</span></a>
</span><span id="ManagementRequest.total_messages-121"><a href="#ManagementRequest.total_messages-121"><span class="linenos">121</span></a><span class="sd"> May raise `RequestException`.</span>
</span><span id="ManagementRequest.total_messages-122"><a href="#ManagementRequest.total_messages-122"><span class="linenos">122</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest.total_messages-123"><a href="#ManagementRequest.total_messages-123"><span class="linenos">123</span></a>
</span><span id="ManagementRequest.total_messages-124"><a href="#ManagementRequest.total_messages-124"><span class="linenos">124</span></a> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">locals</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="ManagementRequest.total_messages-125"><a href="#ManagementRequest.total_messages-125"><span class="linenos">125</span></a> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="ManagementRequest.total_messages-126"><a href="#ManagementRequest.total_messages-126"><span class="linenos">126</span></a>
</span><span id="ManagementRequest.total_messages-127"><a href="#ManagementRequest.total_messages-127"><span class="linenos">127</span></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="ManagementRequest.total_messages-128"><a href="#ManagementRequest.total_messages-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;self&#39;</span><span class="p">,)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ManagementRequest.total_messages-129"><a href="#ManagementRequest.total_messages-129"><span class="linenos">129</span></a> <span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
</span><span id="ManagementRequest.total_messages-130"><a href="#ManagementRequest.total_messages-130"><span class="linenos">130</span></a>
</span><span id="ManagementRequest.total_messages-131"><a href="#ManagementRequest.total_messages-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_request</span><span class="p">(</span><span class="s1">&#39;app/table/total&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">))</span>
</span></pre></div>
<div class="docstring"><p>Get the total number of rows in the tables matching the filters.</p>
<p>May raise <code><a href="#RequestException">RequestException</a></code>.</p>
</div>
</div>
<div id="ManagementRequest.send_message" class="classattr">
<input id="ManagementRequest.send_message-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<div class="decorator">@validate_call</div>
<span class="def">def</span>
<span class="name">send_message</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">message</span><span class="p">:</span> <span class="n"><a href="types.html#AgentMessage">ums.utils.types.AgentMessage</a></span></span><span class="return-annotation">) -> <span class="n"><a href="types.html#AgentResponse">ums.utils.types.AgentResponse</a></span>:</span></span>
@ -644,31 +273,20 @@ The arguments are used for filtering.</p>
</div>
<a class="headerlink" href="#ManagementRequest.send_message"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.send_message-144"><a href="#ManagementRequest.send_message-144"><span class="linenos">144</span></a> <span class="nd">@validate_call</span>
</span><span id="ManagementRequest.send_message-145"><a href="#ManagementRequest.send_message-145"><span class="linenos">145</span></a> <span class="k">def</span> <span class="nf">send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="ManagementRequest.send_message-146"><a href="#ManagementRequest.send_message-146"><span class="linenos">146</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="ManagementRequest.send_message-147"><a href="#ManagementRequest.send_message-147"><span class="linenos">147</span></a><span class="sd"> Send the `message` to the management and return the management&#39;s agent response.</span>
</span><span id="ManagementRequest.send_message-148"><a href="#ManagementRequest.send_message-148"><span class="linenos">148</span></a><span class="sd"> (On error an agent response with error message).</span>
</span><span id="ManagementRequest.send_message-149"><a href="#ManagementRequest.send_message-149"><span class="linenos">149</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ManagementRequest.send_message-150"><a href="#ManagementRequest.send_message-150"><span class="linenos">150</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="ManagementRequest.send_message-151"><a href="#ManagementRequest.send_message-151"><span class="linenos">151</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="o">.</span><span class="n">model_validate</span><span class="p">(</span>
</span><span id="ManagementRequest.send_message-152"><a href="#ManagementRequest.send_message-152"><span class="linenos">152</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_post_request</span><span class="p">(</span>
</span><span id="ManagementRequest.send_message-153"><a href="#ManagementRequest.send_message-153"><span class="linenos">153</span></a> <span class="s2">&quot;message&quot;</span><span class="p">,</span>
</span><span id="ManagementRequest.send_message-154"><a href="#ManagementRequest.send_message-154"><span class="linenos">154</span></a> <span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">()</span>
</span><span id="ManagementRequest.send_message-155"><a href="#ManagementRequest.send_message-155"><span class="linenos">155</span></a> <span class="p">)</span>
</span><span id="ManagementRequest.send_message-156"><a href="#ManagementRequest.send_message-156"><span class="linenos">156</span></a> <span class="p">)</span>
</span><span id="ManagementRequest.send_message-157"><a href="#ManagementRequest.send_message-157"><span class="linenos">157</span></a> <span class="k">except</span> <span class="n">RequestException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="ManagementRequest.send_message-158"><a href="#ManagementRequest.send_message-158"><span class="linenos">158</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span>
</span><span id="ManagementRequest.send_message-159"><a href="#ManagementRequest.send_message-159"><span class="linenos">159</span></a> <span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span>
</span><span id="ManagementRequest.send_message-160"><a href="#ManagementRequest.send_message-160"><span class="linenos">160</span></a> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="ManagementRequest.send_message-161"><a href="#ManagementRequest.send_message-161"><span class="linenos">161</span></a> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span><span id="ManagementRequest.send_message-162"><a href="#ManagementRequest.send_message-162"><span class="linenos">162</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="ManagementRequest.send_message-36"><a href="#ManagementRequest.send_message-36"><span class="linenos">36</span></a> <span class="k">def</span> <span class="nf">send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span><span class="n">AgentMessage</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentResponse</span><span class="p">:</span>
</span><span id="ManagementRequest.send_message-37"><a href="#ManagementRequest.send_message-37"><span class="linenos">37</span></a> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="ManagementRequest.send_message-38"><a href="#ManagementRequest.send_message-38"><span class="linenos">38</span></a> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/message&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url</span><span class="p">),</span>
</span><span id="ManagementRequest.send_message-39"><a href="#ManagementRequest.send_message-39"><span class="linenos">39</span></a> <span class="n">data</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">model_dump_json</span><span class="p">(),</span>
</span><span id="ManagementRequest.send_message-40"><a href="#ManagementRequest.send_message-40"><span class="linenos">40</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;accept&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span> <span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
</span><span id="ManagementRequest.send_message-41"><a href="#ManagementRequest.send_message-41"><span class="linenos">41</span></a> <span class="p">)</span>
</span><span id="ManagementRequest.send_message-42"><a href="#ManagementRequest.send_message-42"><span class="linenos">42</span></a>
</span><span id="ManagementRequest.send_message-43"><a href="#ManagementRequest.send_message-43"><span class="linenos">43</span></a> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span><span id="ManagementRequest.send_message-44"><a href="#ManagementRequest.send_message-44"><span class="linenos">44</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="o">.</span><span class="n">model_validate_json</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span><span id="ManagementRequest.send_message-45"><a href="#ManagementRequest.send_message-45"><span class="linenos">45</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="ManagementRequest.send_message-46"><a href="#ManagementRequest.send_message-46"><span class="linenos">46</span></a> <span class="k">return</span> <span class="n">AgentResponse</span><span class="p">(</span><span class="n">count</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">error_msg</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span>
</span></pre></div>
<div class="docstring"><p>Send the <code>message</code> to the management and return the management's agent response.
(On error an agent response with error message).</p>
</div>
</div>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,7 @@
<ul>
<li><a href="/app/table" target="_blank">&nearr; Web App: Table</a></li>
<li><a href="/app/new" target="_blank">&nearr; Web App: New Riddle</a></li>
<li><a href="/share/" target="_blank">&nearr; Data: Access the riddle files</a></li>
<li><a href="/api" target="_blank">&nearr; Documentation: API </a></li>
<li><a href="/api/" target="_blank">&nearr; Documentation: API </a></li>
<li><a href="/docs/" target="_blank">&nearr; Documentation: Code </a></li>
</ul>
{% endblock %}