47 lines
3.1 KiB
Python
47 lines
3.1 KiB
Python
import copy
|
|
import json
|
|
from pathlib import Path
|
|
import tempfile
|
|
import unittest
|
|
from types import SimpleNamespace
|
|
from profiles import Profiles,SCHEMAS,chat_parameters
|
|
from api_compat import normalize_chat,CompatibilityError
|
|
from deploy.configure_llm_sampling import configure
|
|
|
|
class SamplingTests(unittest.TestCase):
|
|
def test_legacy_save_roundtrip_and_validation(self):
|
|
model=dict(id='m',kind='chat',profile_eligible=True,repo='test/chat',file='model.gguf')
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
path=Path(directory)/'profiles.json';catalog=SimpleNamespace(entry=lambda _:model)
|
|
profiles=Profiles(path,catalog)
|
|
params={k:v[2] for k,v in SCHEMAS['chat'].items() if not k.endswith('penalty')}
|
|
payload=dict(id=None,revision=0,name='Legacy',kind='chat',model_id='m',parameters=params)
|
|
saved=profiles.save(payload)
|
|
self.assertEqual(saved['parameters']['repeat_penalty'],1.0)
|
|
payload.update(id=saved['id'],revision=saved['revision'],parameters=saved['parameters'])
|
|
payload['parameters'].update(repeat_penalty=1.15,presence_penalty=.5,frequency_penalty=-.2)
|
|
profiles.save(payload)
|
|
restored=Profiles(path,catalog).rows[0]
|
|
self.assertEqual(restored['parameters']['repeat_penalty'],1.15)
|
|
for field,value in [('repeat_penalty',-1),('presence_penalty',3),('frequency_penalty',float('nan')),('repeat_penalty',True)]:
|
|
bad=copy.deepcopy(payload);bad['revision']=restored['revision'];bad['parameters'][field]=value
|
|
with self.assertRaises(ValueError):profiles.save(bad)
|
|
self.assertEqual(json.loads(path.read_text())[0],restored)
|
|
def test_client_penalties_validation_and_no_mutation(self):
|
|
request=dict(repeat_penalty=1.15,presence_penalty=.5,frequency_penalty=-.2)
|
|
self.assertEqual(normalize_chat(request)[0],request)
|
|
for field,value in [('repeat_penalty',-1),('presence_penalty',3),('frequency_penalty',float('inf')),('repeat_penalty',True)]:
|
|
with self.assertRaises(CompatibilityError):normalize_chat({field:value})
|
|
def test_preset_application_preserves_unrelated_settings_and_is_idempotent(self):
|
|
rows=[dict(id='q',name='Qwen3.8 27B - Medium',kind='chat',model_id='q',revision=7,parameters=dict(context=160000,slots=1,batch=2048,ubatch=256,gpu_devices=['5080','3060'],tensor_split=[85,15],vision_device='3060',temperature=.2)),dict(id='i',name='Image',kind='image',model_id='i',parameters={}),dict(id='u',name='Unknown',kind='chat',model_id='u',parameters={})]
|
|
entries={'q':dict(repo='jpetrina/Qwen3.8-27B-IQ4_XS-pure-GGUF')}
|
|
result,report=configure(rows,entries)
|
|
self.assertEqual(result[0]['parameters']['temperature'],1)
|
|
self.assertEqual(result[0]['revision'],8)
|
|
for key in ('context','slots','batch','ubatch','gpu_devices','tensor_split','vision_device'):
|
|
self.assertEqual(result[0]['parameters'][key],rows[0]['parameters'][key])
|
|
self.assertEqual(result[1:],rows[1:]);self.assertEqual(rows[0]['parameters']['temperature'],.2)
|
|
self.assertEqual(configure(result,entries)[0],result)
|
|
expanded,_=configure(result,entries,True)
|
|
self.assertEqual(expanded[-2]['parameters']['tensor_split'],[86,14]);self.assertEqual(expanded[-1]['parameters']['vision_device'],'cpu')
|