Notes 18.09.

This commit is contained in:
Magnus Bender 2024-09-18 16:32:01 +02:00
parent 28d579ce59
commit 622f8bc009
Signed by: bender
GPG Key ID: 5149A211831F2BD7
7 changed files with 336 additions and 71 deletions

3
Dockerfile Normal file
View File

@ -0,0 +1,3 @@
FROM git.chai.uni-hamburg.de/ums-agenten/base-process:cpu
RUN apt install my-pkg

View File

@ -1,73 +1,2 @@
# Agenten-Plattform
## Allgemein
- Docker Container
- Ein Manager-Agent
- Viele Worker-Agenten
- JSON Post Requests
- Studis erstellen Worker-Agenten
- Library vorgegeben
- HTTP-Server für Tasks, Ergebnisse per HTTP an Manager
- Worker registriert sich beim Manager mit
- Seiner IP/ HTTP Schnittstelle
- Seinen Fähigkeiten (Capabilities)
## Agent Capabilities
-
- Vorverarbeitung
- Evaluation
## Example
- Manager und einfache Worker
## Requests
```
{
"type" : "register" // "unregister",
"body" : {
"capabilities" : [""],
"endpoint" : "10.0.0.12:8080"
},
"sender-id" : "worker1",
"comment" : "",
"error" : false
}
```
```
{
"type" : "task",
"task-id" : "t12",
"capability" : "",
"body" : {
},
"sender-id" : "manager",
"comment" : "",
"error" : false
}
```
```
{
"type" : "response",
"task-id" : "t12"
"body" : {
},
"sender-id" : "worker1",
"comment" : "",
"error" : false
}
```
## Aufgabe
- Online-Escape-Room
- Unterlagen, die zum "Ausgang" führen
- Eingabe: Unterlagen für Rätsel (Audio, Text, Bilder, ...) [ZIP, JSON]
- Vorverarbeitung: Agent je für Audio, Text, Bild (→ alles textlich)
- Analyse:
- Ausgabe: Lösung & Erklärung
- Ziel: Finde Lösung mit Erklärung

132
Requests.md Normal file
View File

@ -0,0 +1,132 @@
### Ablauf
1. Daten und Rästel eingeben
- an Management von Benutzer (oder als Subrätsel)
```json
{
"id" : "xyz",
"riddle" : {
"context" : "The values of the variables of the following math problem are given in the text document as written numbers.",
"question" : "What is x+y?",
"solution_before" : "", # if trial > 0
"review_before": "" # if trial > 0
},
"trial" : 0, # did we try this before
"steps" : {
"extract" : true,
"solve" : true,
"validate": true,
},
"data" : [
{
"type" : "text",
"file" : "./my-test.txt"
},
...
]
}
```
2. Daten verteilen (`if "extract" : true`)
- an alle "🤖 Daten einlesen" vom Management
```json
{
"id" : "xyz",
"data" : [
{
"type" : "text",
"file" : "./my-test.txt"
},
...
]
}
```
3. Verarbeitete Daten annehmen (`if "extract" : true|false`)
- von allen "🤖 Daten einlesen" an Management
```json
{
"id" : "xyz",
"data" : [
{
"type" : "text",
"file" : "./my-test.txt",
"extraction" : "./my-test.json" # schema für alle gleich
},
...
]
}
```
4. Rätsel lösen (`if "solve" : true|false`)
- an (alle) "🤖 Lösung bestimmen" von Management
```json
{
"id" : "xyz",
"riddle" : { ... },
"data" : [
{
"type" : "text",
"file" : "./my-test.txt",
"extraction" : "./my-test.json"
},
...
]
}
```
- Muss ein "Subrätsel" erzeugen (können), wenn weitere Datenanalyse notwenig ist
- Mit einer Submenge der Daten bzw. konkreten Fragen etc.
5. Lösung eines Rätsel annehmen (`if "solve" : true`)
- von (alle) "🤖 Lösung bestimmen" an Management
```json
{
"id" : "xyz",
"solution" : "26",
"explanation" : "x = 12, y = 14, ...",
"sub_riddles" : [ # optional
"xyz-1",
"xyz-2"
],
"used_data" : [ # optional
{
"type" : "text",
"file" : "./my-test.txt",
"extraction" : "./my-test.json"
},
...
]
}
```
6. Lösung validieren lassen (`if "validate": true`)
- an (alle) "🤖 Lösung validieren" durch Management
```json
{
"id" : "xyz",
"riddle" : { ... }
"solution" : "26",
"explanation" : "x = 12, y = 14, ...",
"sub_riddles" : [ # optional
"xyz-1",
"xyz-2"
],
"used_data" : [ # optional
{
"type" : "text",
"file" : "./my-test.txt",
"extraction" : "./my-test.json"
},
...
]
}
```
7. Validierung annehmen (`if "validate": true`)
- von (alle) "🤖 Lösung validieren" an Management
```json
{
"id" : "xyz",
"solution" : "26",
"explanation" : "x = 12, y = 14, ...",
"accept" : false # or true
"review" : "y does not match Y"
}
```
8. Ausgabe oder Wiedervorlage
- von Management an User oder als neues Riddle
- `if "accept" : false`: Neues Riddle mit `trial+1`, `solution_before`, `review_before`
- `if "accept" : true`: User bekommt `solution, explanation, review`

21
docker-compose.yml Normal file
View File

@ -0,0 +1,21 @@
services:
management:
image: git.chai.uni-hamburg.de/ums-agenten/management:latest
ports:
-
environment:
- AGENTS_PROCESS=http://agent_process_1:3001,http://agent_process_2:3001
- AGENTS_SOLVE=http://agent_solve_1:3001
- AGENTS_GATEKEEPER=http://agent_gatekeeper_1:3001
volumes:
- /xxx/:
agent_process_1:
image: git.chai.uni-hamburg.de/ums-agenten/base-process:cpu
#image: git.chai.uni-hamburg.de/ums-agenten/base-process:gpu
build: .
environment:
- MANAGEMENT=http://management:3001
volumes:
- /xxx/:/ums-agenten/shared/

57
src/agent/agent.py Normal file
View File

@ -0,0 +1,57 @@
from abc import abstractmethod
from typing import List, Dict
from o_types import *
class Agent():
def process_result():
pass
# hier die Kommunikation mit dem Management Server
""" ===== """
class ProcessAgent(Agent):
TYPE:str = None
@abstractmethod
def on_process_data(self, data:List[Data]):
pass
class TextAgentExample(ProcessAgent):
TYPE = Data.TYPE_TEXT
def on_process_data(self, data:List[Data]):
# Studi Code
self.process_result(Data(...))
class ImageAgentExample(ProcessAgent):
TYPE = Data.TYPE_IMAGE
class AudioAgentExample(ProcessAgent):
TYPE = Data.TYPE_AUDIO
""" ===== """
class SolveAgent(Agent):
@abstractmethod
def on_riddle_data(self, riddle:Riddle, data:List[Data]):
pass
# Studi Code
self.new_riddle(Riddle('x', 'y', 'z'))
self.send_riddle_result(...)
""" ===== """
class GatekeeperAgent(Agent):
@abstractmethod
def on_result_check(self, xyz):
# Studi Code
self.send_check_result(accept=True|False, ...)

80
src/agent/basic_agent.py Normal file
View File

@ -0,0 +1,80 @@
from agent import Agent
class ProcessTextAgent(Agent):
TYPE = "text" or "image"
def on_process_data(self, data:List[Dict]):
return filter(lambda x: x["type"] == self.TYPE, data)
# {type: "text", "file" : ""}
class ExampleAgent(ProcessTextAgent):
def on_process_data(self, data:List[Dict]):
# {type: "text", "file" : ""}
self.after_process_data(result)
# disk -> 123
# agent 1 disk -> 123
class Agent:
def request_management(self, request):
request.get(os.gentenv('MANAGEMENT'), data)
# https ...
def write_result(...):
self.request_management.write(...)
def read_result(...):
self.request_management.read(...)
class ProcessAgent(Agent):
TYPE : str = None
def on_process_data(self, data:List[Dict]):
pass
class TextAgent(ProcessAgent):
TYPE = 'text'
text_data = self.on_process_data()
def on_process_data(self, data:List[Dict]):
text_data = filter_text_data()
processed_data = text_func1(text_data)
self.write_result(processed_data)
def text_func1():
...
def text_func2():
...
def text_func3():
...
class ImageAgent(ProcessAgent):
TYPE = 'image'
image_data = self.on_process_data()
def on_process_data(self, data:list[Dict])
image_data = filter_image_data()
def image_func1():
...
...

43
src/agent/o_types.py Normal file
View File

@ -0,0 +1,43 @@
from typing import List
class Riddle():
def __init__(self):
self.id = "" # -> management.get_riddle_by_id(id)
self.parent_id = "" # ?!
self.context = "1234"
self.question = "12"
self.data:List[Data] = []
def from_json(json):
return Riddle(json)
def to_json(self):
return {
"context" : self.context,
"question" : self.question,
"solution_before" : "", # if trial > 0
"review_before": "" # if trial > 0
}
class Data():
TYPE_TEXT = "text"
TYPE_AUDIO = "audio"
TYPE_IMAGE = "image"
def __init__(self):
self.type = 1
self.file = 2
self.extraction = 3
def to_json(self):
return {
"type" : self.type,
"file" : self.file,
"extraction" : self.extraction
}