configuration: started to implement new format

This commit is contained in:
juk0de 2023-09-06 22:52:03 +02:00
parent be028d7a00
commit 13c4127827
2 changed files with 53 additions and 21 deletions

View File

@ -17,8 +17,9 @@ class OpenAI(AI):
The OpenAI AI client. The OpenAI AI client.
""" """
def __init__(self, name: str, config: OpenAIConfig) -> None: def __init__(self, config: OpenAIConfig) -> None:
self.name = name self.ai_type = config.ai_type
self.name = config.name
self.config = config self.config = config
def request(self, def request(self,
@ -31,8 +32,7 @@ class OpenAI(AI):
chat history. The nr. of requested answers corresponds to the chat history. The nr. of requested answers corresponds to the
nr. of messages in the 'AIResponse'. nr. of messages in the 'AIResponse'.
""" """
# FIXME: use real 'system' message (store in OpenAIConfig) oai_chat = self.openai_chat(chat, self.config.system, question)
oai_chat = self.openai_chat(chat, "system", question)
response = openai.ChatCompletion.create( response = openai.ChatCompletion.create(
model=self.config.model, model=self.config.model,
messages=oai_chat, messages=oai_chat,

View File

@ -1,6 +1,7 @@
import yaml import yaml
from pathlib import Path
from typing import Type, TypeVar, Any from typing import Type, TypeVar, Any
from dataclasses import dataclass, asdict from dataclasses import dataclass, asdict, field
ConfigInst = TypeVar('ConfigInst', bound='Config') ConfigInst = TypeVar('ConfigInst', bound='Config')
OpenAIConfigInst = TypeVar('OpenAIConfigInst', bound='OpenAIConfig') OpenAIConfigInst = TypeVar('OpenAIConfigInst', bound='OpenAIConfig')
@ -11,6 +12,7 @@ class AIConfig:
""" """
The base class of all AI configurations. The base class of all AI configurations.
""" """
ai_type: str
name: str name: str
@ -19,13 +21,18 @@ class OpenAIConfig(AIConfig):
""" """
The OpenAI section of the configuration file. The OpenAI section of the configuration file.
""" """
api_key: str # all members have default values, so we can easily create
model: str # a default configuration
temperature: float ai_type: str = 'openai'
max_tokens: int name: str = 'openai_1'
top_p: float system: str = 'You are an assistant'
frequency_penalty: float api_key: str = '0123456789'
presence_penalty: float model: str = 'gpt-3.5'
temperature: float = 1.0
max_tokens: int = 4000
top_p: float = 1.0
frequency_penalty: float = 0.0
presence_penalty: float = 0.0
@classmethod @classmethod
def from_dict(cls: Type[OpenAIConfigInst], source: dict[str, Any]) -> OpenAIConfigInst: def from_dict(cls: Type[OpenAIConfigInst], source: dict[str, Any]) -> OpenAIConfigInst:
@ -33,7 +40,9 @@ class OpenAIConfig(AIConfig):
Create OpenAIConfig from a dict. Create OpenAIConfig from a dict.
""" """
return cls( return cls(
name='OpenAI', ai_type='openai',
name=str(source['name']),
system=str(source['system']),
api_key=str(source['api_key']), api_key=str(source['api_key']),
model=str(source['model']), model=str(source['model']),
max_tokens=int(source['max_tokens']), max_tokens=int(source['max_tokens']),
@ -43,15 +52,24 @@ class OpenAIConfig(AIConfig):
presence_penalty=float(source['presence_penalty']) presence_penalty=float(source['presence_penalty'])
) )
def as_dict(self) -> dict[str, Any]:
return asdict(self)
def create_default_ai_configs() -> dict[str, AIConfig]:
openai_conf = OpenAIConfig()
return {openai_conf.name: openai_conf}
@dataclass @dataclass
class Config: class Config:
""" """
The configuration file structure. The configuration file structure.
""" """
system: str # all members have default values, so we can easily create
db: str # a default configuration
openai: OpenAIConfig db: str = './db/'
ais: dict[str, AIConfig] = field(default_factory=create_default_ai_configs)
@classmethod @classmethod
def from_dict(cls: Type[ConfigInst], source: dict[str, Any]) -> ConfigInst: def from_dict(cls: Type[ConfigInst], source: dict[str, Any]) -> ConfigInst:
@ -59,20 +77,34 @@ class Config:
Create Config from a dict. Create Config from a dict.
""" """
return cls( return cls(
system=str(source['system']),
db=str(source['db']), db=str(source['db']),
openai=OpenAIConfig.from_dict(source['openai']) ais=source['ais'] # FIXME: call correct constructors
) )
@classmethod
def create_default(self, file_path: Path) -> None:
"""
Creates a default Config in the given file.
"""
conf = Config()
conf.to_file(file_path)
@classmethod @classmethod
def from_file(cls: Type[ConfigInst], path: str) -> ConfigInst: def from_file(cls: Type[ConfigInst], path: str) -> ConfigInst:
with open(path, 'r') as f: with open(path, 'r') as f:
source = yaml.load(f, Loader=yaml.FullLoader) source = yaml.load(f, Loader=yaml.FullLoader)
# add the AI name to the config (for easy internal access)
for ai_name, ai_conf in source['ais'].items():
ai_conf['name'] = ai_name
return cls.from_dict(source) return cls.from_dict(source)
def to_file(self, path: str) -> None: def to_file(self, file_path: Path) -> None:
with open(path, 'w') as f: # remove the AI name from the config (for a cleaner format)
yaml.dump(asdict(self), f, sort_keys=False) data = self.as_dict()
for ai_name, ai_conf in data['ais'].items():
del (ai_conf['name'])
with open(file_path, 'w') as f:
yaml.dump(data, f, sort_keys=False)
def as_dict(self) -> dict[str, Any]: def as_dict(self) -> dict[str, Any]:
return asdict(self) return asdict(self)