Skip to content

Commit afcef9c

Browse files
committed
new config system, major
1 parent 54b11ad commit afcef9c

17 files changed

Lines changed: 362 additions & 259 deletions

oneping/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from .utils import cumcat, sprint, streamer, streamer_async
1+
from .utils import cumcat, sprint, streamer, streamer_async, load_image_uri
2+
from .providers import reload
23
from .curl import (
34
reply as reply_url,
45
reply_async as reply_async_url,

oneping/api.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# combined interface
22

3-
from .providers import DEFAULT_PROVIDER
43
from .native import has_native
54

65
from .curl import (
@@ -21,43 +20,43 @@
2120
transcribe as transcribe_native,
2221
)
2322

24-
def reply(query, provider=DEFAULT_PROVIDER, native=True, **kwargs):
23+
def reply(query, provider=None, native=True, **kwargs):
2524
if native and has_native(provider):
2625
return reply_native(query, provider, **kwargs)
2726
else:
2827
return reply_url(query, provider=provider, **kwargs)
2928

30-
def reply_async(query, provider=DEFAULT_PROVIDER, native=True, **kwargs):
29+
def reply_async(query, provider=None, native=True, **kwargs):
3130
if native and has_native(provider):
3231
return reply_async_native(query, provider, **kwargs)
3332
else:
3433
return reply_async_url(query, provider=provider, **kwargs)
3534

36-
def stream(query, provider=DEFAULT_PROVIDER, native=True, **kwargs):
35+
def stream(query, provider=None, native=True, **kwargs):
3736
if native and has_native(provider):
3837
return stream_native(query, provider, **kwargs)
3938
else:
4039
return stream_url(query, provider=provider, **kwargs)
4140

42-
def stream_async(query, provider=DEFAULT_PROVIDER, native=True, **kwargs):
41+
def stream_async(query, provider=None, native=True, **kwargs):
4342
if native and has_native(provider):
4443
return stream_async_native(query, provider, **kwargs)
4544
else:
4645
return stream_async_url(query, provider=provider, **kwargs)
4746

48-
def embed(text, provider=DEFAULT_PROVIDER, native=True, **kwargs):
47+
def embed(text, provider=None, native=True, **kwargs):
4948
if native and has_native(provider):
5049
return embed_native(text, provider, **kwargs)
5150
else:
5251
return embed_url(text, provider=provider, **kwargs)
5352

54-
def tokenize(text, provider=DEFAULT_PROVIDER, native=True, **kwargs):
53+
def tokenize(text, provider=None, native=True, **kwargs):
5554
if native and has_native(provider):
5655
return tokenize_native(text, provider, **kwargs)
5756
else:
5857
return tokenize_url(text, provider=provider, **kwargs)
5958

60-
def transcribe(audio, provider=DEFAULT_PROVIDER, native=True, **kwargs):
59+
def transcribe(audio, provider=None, native=True, **kwargs):
6160
if native and has_native(provider):
6261
return transcribe_native(audio, provider, **kwargs)
6362
else:

oneping/chat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# chat interface
22

3-
from .providers import DEFAULT_SYSTEM, content_oneping
3+
from .providers import CONFIG as C, content_oneping
44
from .api import reply, reply_async, stream, stream_async
55

66
def history_update(query, text, image=None):
@@ -12,7 +12,7 @@ def history_update(query, text, image=None):
1212
# chat interface
1313
class Chat:
1414
def __init__(self, system=None, **kwargs):
15-
self.system = DEFAULT_SYSTEM if system is None else system
15+
self.system = C.system if system is None else system
1616
self.kwargs = kwargs
1717
self.clear()
1818

oneping/config.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# base config
2+
max_tokens = 8192

oneping/curl.py

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import requests
66
import aiohttp
77

8-
from .providers import get_provider, convert_history, DEFAULT_MAX_TOKENS, DEFAULT_PROVIDER
8+
from .providers import get_provider, convert_history
9+
from .utils import ensure_image_uri
910

1011
##
1112
## printing
@@ -34,40 +35,44 @@ def prepare_model(prov, model_key, model=None):
3435
return {'model': model} if model is not None else {}
3536

3637
def prepare_auth(prov, api_key=None):
37-
if (auth_func := prov.get('authorize')) is not None:
38-
if (api_key := os.environ.get(prov['api_key_env'])) is None:
39-
raise Exception('Cannot find API key in {api_key_env}')
38+
if (auth_func := prov.authorize) is not None:
39+
if (api_key := os.environ.get(prov.api_key_env)) is None:
40+
raise Exception(f'Cannot find API key in {prov.api_key_env}')
4041
headers_auth = auth_func(api_key)
4142
else:
4243
headers_auth = {}
4344
return headers_auth
4445

4546
def prepare_request(
46-
query, provider=DEFAULT_PROVIDER, system=None, image=None, prefill=None, prediction=None, history=None,
47-
base_url=None, path=None, api_key=None, model=None, max_tokens=DEFAULT_MAX_TOKENS, **kwargs
47+
query, provider=None, system=None, image=None, prefill=None, prediction=None, history=None,
48+
base_url=None, path=None, api_key=None, model=None, max_tokens=None, **kwargs
4849
):
4950
# external provider details
5051
prov = get_provider(provider)
51-
max_tokens_name = prov.get('max_tokens_name', 'max_completion_tokens')
5252
url = prepare_url(prov, 'chat_path', base_url=base_url, path=path)
5353
payload_model = prepare_model(prov, 'chat_model', model=model)
5454

5555
# convert history to provider format
56-
history = convert_history(history, prov['content'])
56+
history = convert_history(history, prov.content)
5757

5858
# get extra headers
5959
headers_auth = prepare_auth(prov, api_key=api_key)
6060
headers_extra = prov.get('headers', {})
6161

6262
# get message payload
63-
content = prov['content'](query, image=image)
64-
payload_message = prov['payload'](
63+
img_data = ensure_image_uri(image)
64+
content = prov.content(query, image=img_data)
65+
payload_message = prov.payload(
6566
content, system=system, prefill=prefill, prediction=prediction, history=history
6667
)
6768

6869
# compose request
6970
headers = {'Content-Type': 'application/json', **headers_auth, **headers_extra}
70-
payload = {**payload_model, **payload_message, max_tokens_name: max_tokens, **kwargs}
71+
payload = {**payload_model, **payload_message, **kwargs}
72+
73+
# add in max tokens
74+
if max_tokens is not None:
75+
payload[prov.max_tokens_name] = max_tokens
7176

7277
# return url, headers, payload
7378
return url, headers, payload
@@ -76,10 +81,9 @@ def prepare_request(
7681
## requests
7782
##
7883

79-
def reply(query, provider=DEFAULT_PROVIDER, history=None, prefill=None, dryrun=False, **kwargs):
84+
def reply(query, provider=None, history=None, prefill=None, dryrun=False, **kwargs):
8085
# get provider
8186
prov = get_provider(provider)
82-
extractor = prov['response']
8387

8488
# prepare request
8589
url, headers, payload = prepare_request(
@@ -97,7 +101,7 @@ def reply(query, provider=DEFAULT_PROVIDER, history=None, prefill=None, dryrun=F
97101

98102
# extract text
99103
data = response.json()
100-
text = extractor(data)
104+
text = prov.response(data)
101105

102106
# add in prefill
103107
if prefill is not None:
@@ -106,10 +110,9 @@ def reply(query, provider=DEFAULT_PROVIDER, history=None, prefill=None, dryrun=F
106110
# return text
107111
return text
108112

109-
async def reply_async(query, provider=DEFAULT_PROVIDER, history=None, prefill=None, **kwargs):
113+
async def reply_async(query, provider=None, history=None, prefill=None, **kwargs):
110114
# get provider
111115
prov = get_provider(provider)
112-
extractor = prov['response']
113116

114117
# prepare request
115118
url, headers, payload = prepare_request(
@@ -123,7 +126,7 @@ async def reply_async(query, provider=DEFAULT_PROVIDER, history=None, prefill=No
123126

124127
# extract text
125128
data = await response.json()
126-
text = extractor(data)
129+
text = prov.response(data)
127130

128131
# add in prefill
129132
if prefill is not None:
@@ -154,10 +157,9 @@ async def iter_lines(inputs):
154157
if len(buffer) > 0:
155158
yield buffer
156159

157-
def stream(query, provider=DEFAULT_PROVIDER, history=None, prefill=None, **kwargs):
160+
def stream(query, provider=None, history=None, prefill=None, **kwargs):
158161
# get provider
159162
prov = get_provider(provider)
160-
extractor = prov['stream']
161163

162164
# prepare request
163165
url, headers, payload = prepare_request(
@@ -181,14 +183,13 @@ def stream(query, provider=DEFAULT_PROVIDER, history=None, prefill=None, **kwarg
181183
for line in response.iter_lines():
182184
if (data := parse_sse(line)) is not None:
183185
parsed = json.loads(data)
184-
text = extractor(parsed)
186+
text = prov.stream(parsed)
185187
if text is not None:
186188
yield text
187189

188-
async def stream_async(query, provider=DEFAULT_PROVIDER, history=None, prefill=None, **kwargs):
190+
async def stream_async(query, provider=None, history=None, prefill=None, **kwargs):
189191
# get provider
190192
prov = get_provider(provider)
191-
extractor = prov['stream']
192193

193194
# prepare request
194195
url, headers, payload = prepare_request(
@@ -214,15 +215,15 @@ async def stream_async(query, provider=DEFAULT_PROVIDER, history=None, prefill=N
214215
async for line in iter_lines(chunks):
215216
if (data := parse_sse(line)) is not None:
216217
parsed = json.loads(data)
217-
text = extractor(parsed)
218+
text = prov.stream(parsed)
218219
if text is not None:
219220
yield text
220221

221222
##
222223
## embeddings
223224
##
224225

225-
def embed(text, provider=DEFAULT_PROVIDER, base_url=None, path=None, api_key=None, model=None, timeout=None, **kwargs):
226+
def embed(text, provider=None, base_url=None, path=None, api_key=None, model=None, timeout=None, **kwargs):
226227
# get provider details
227228
prov = get_provider(provider)
228229
url = prepare_url(prov, f'embed_path', base_url=base_url, path=path)
@@ -233,7 +234,7 @@ def embed(text, provider=DEFAULT_PROVIDER, base_url=None, path=None, api_key=Non
233234

234235
# make payload
235236
payload_model = prepare_model(prov, 'embed_model', model=model)
236-
payload_message = prov['embed_payload'](text)
237+
payload_message = prov.embed_payload(text)
237238

238239
# compose request
239240
headers = {'Content-Type': 'application/json', **headers_auth, **headers_extra}
@@ -245,12 +246,12 @@ def embed(text, provider=DEFAULT_PROVIDER, base_url=None, path=None, api_key=Non
245246

246247
# extract result
247248
data = response.json()
248-
result = prov['embed_response'](data)
249+
result = prov.embed_response(data)
249250

250251
# return result
251252
return result
252253

253-
def tokenize(text, provider=DEFAULT_PROVIDER, base_url=None, path=None, api_key=None, model=None, timeout=None, **kwargs):
254+
def tokenize(text, provider=None, base_url=None, path=None, api_key=None, model=None, timeout=None, **kwargs):
254255
# get provider details
255256
prov = get_provider(provider)
256257
url = prepare_url(prov, 'tokenize_path', base_url=base_url, path=path)
@@ -261,7 +262,7 @@ def tokenize(text, provider=DEFAULT_PROVIDER, base_url=None, path=None, api_key=
261262

262263
# make payload
263264
payload_model = prepare_model(prov, 'embed_model', model=model)
264-
payload_message = prov['tokenize_payload'](text)
265+
payload_message = prov.tokenize_payload(text)
265266

266267
# compose request
267268
headers = {'Content-Type': 'application/json', **headers_auth, **headers_extra}
@@ -273,7 +274,7 @@ def tokenize(text, provider=DEFAULT_PROVIDER, base_url=None, path=None, api_key=
273274

274275
# extract result
275276
data = response.json()
276-
result = prov['tokenize_response'](data)
277+
result = prov.tokenize_response(data)
277278

278279
# return result
279280
return result

oneping/native/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
##
66

77
def has_native(provider):
8-
return provider not in ('llama.cpp', 'tei', 'vllm', 'oneping')
8+
return provider not in (None, 'llama.cpp', 'tei', 'vllm', 'oneping')
99

1010
##
1111
## dummy function

oneping/native/anthropic.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import anthropic
55

66
from ..providers import (
7-
DEFAULT_SYSTEM, DEFAULT_MAX_TOKENS, ANTHROPIC_MODEL, ANTHROPIC_HEADERS, ANTHROPIC_KEYENV,
7+
CONFIG as C, PROVIDERS as P,
88
content_anthropic, convert_history, payload_anthropic,
99
response_anthropic_native, stream_anthropic_native
1010
)
@@ -22,35 +22,38 @@ def make_payload(query, image=None, system=None, history=None):
2222
## common interface
2323
##
2424

25-
def make_client(api_key=None, headers=ANTHROPIC_HEADERS, async_client=False):
26-
api_key = api_key if api_key is not None else os.environ.get(ANTHROPIC_KEYENV)
25+
def make_client(async_client=False, api_key=None):
26+
api_key = api_key if api_key is not None else os.environ.get(P.anthropic.api_key_env)
2727
client_class = anthropic.AsyncAnthropic if async_client else anthropic.Anthropic
28-
return client_class(api_key=api_key, default_headers=headers)
28+
return client_class(api_key=api_key, default_headers=P.anthropic.headers)
2929

30-
def reply(query, image=None, history=None, prefill=None, prediction=None, system=DEFAULT_SYSTEM, api_key=None, model=ANTHROPIC_MODEL, max_tokens=DEFAULT_MAX_TOKENS, headers=ANTHROPIC_HEADERS, **kwargs):
31-
client = make_client(api_key=api_key, headers=headers)
30+
def reply(query, image=None, history=None, prefill=None, prediction=None, system=C.system, api_key=None, model=P.anthropic.chat_model, max_tokens=C.max_tokens, **kwargs):
31+
client = make_client(api_key=api_key)
3232
payload = make_payload(query, image=image, system=system, history=history)
3333
response = client.messages.create(model=model, max_tokens=max_tokens, **payload, **kwargs)
3434
return response_anthropic_native(response)
3535

36-
async def reply_async(query, image=None, history=None, prefill=None, prediction=None, system=DEFAULT_SYSTEM, api_key=None, model=ANTHROPIC_MODEL, max_tokens=DEFAULT_MAX_TOKENS, headers=ANTHROPIC_HEADERS, **kwargs):
37-
client = make_client(api_key=api_key, headers=headers, async_client=True)
36+
async def reply_async(query, image=None, history=None, prefill=None, prediction=None, system=C.system, api_key=None, model=None, max_tokens=C.max_tokens, **kwargs):
37+
model = model if model is not None else P.anthropic.chat_model
38+
client = make_client(async_client=True, api_key=api_key)
3839
payload = make_payload(query, image=image, system=system, history=history)
3940
response = await client.messages.create(model=model, max_tokens=max_tokens, **payload, **kwargs)
4041
text = response_anthropic_native(response)
4142
return (prefill + text) if prefill is not None else text
4243

43-
def stream(query, image=None, history=None, prefill=None, prediction=None, system=DEFAULT_SYSTEM, api_key=None, model=ANTHROPIC_MODEL, max_tokens=DEFAULT_MAX_TOKENS, headers=ANTHROPIC_HEADERS, **kwargs):
44-
client = make_client(api_key=api_key, headers=headers)
44+
def stream(query, image=None, history=None, prefill=None, prediction=None, system=C.system, api_key=None, model=None, max_tokens=C.max_tokens, **kwargs):
45+
model = model if model is not None else P.anthropic.chat_model
46+
client = make_client(api_key=api_key)
4547
payload = make_payload(query, image=image, system=system, history=history)
4648
response = client.messages.create(model=model, stream=True, max_tokens=max_tokens, **payload, **kwargs)
4749
if prefill is not None:
4850
yield prefill
4951
for chunk in response:
5052
yield stream_anthropic_native(chunk)
5153

52-
async def stream_async(query, image=None, history=None, prefill=None, prediction=None, system=DEFAULT_SYSTEM, api_key=None, model=ANTHROPIC_MODEL, max_tokens=DEFAULT_MAX_TOKENS, headers=ANTHROPIC_HEADERS, **kwargs):
53-
client = make_client(api_key=api_key, headers=headers, async_client=True)
54+
async def stream_async(query, image=None, history=None, prefill=None, prediction=None, system=C.system, api_key=None, model=None, max_tokens=C.max_tokens, **kwargs):
55+
model = model if model is not None else P.anthropic.chat_model
56+
client = make_client(async_client=True, api_key=api_key)
5457
payload = make_payload(query, image=image, system=system, history=history)
5558
response = await client.messages.create(model=model, stream=True, max_tokens=max_tokens, **payload, **kwargs)
5659
if prefill is not None:

0 commit comments

Comments
 (0)