fishr 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fishr/Base/Conversation.py +395 -0
- fishr/Base/DeepAI.py +385 -0
- fishr/Base/DphnAI.py +207 -0
- fishr/Base/Eris.py +225 -0
- fishr/Base/NoTrack.py +259 -0
- fishr/Base/Noxus.py +390 -0
- fishr/Base/OperaAria.py +469 -0
- fishr/Base/Quillbot.py +243 -0
- fishr/Base/Telnyx.py +268 -0
- fishr/Base/Yqcloud.py +189 -0
- fishr/Base/__init__.py +40 -0
- fishr/Http.py +117 -0
- fishr/Loop.py +13 -0
- fishr/Types.py +248 -0
- fishr/Utils.py +95 -0
- fishr/__init__.py +205 -0
- fishr/__main__.py +39 -0
- fishr/audio/OpenAIFM.py +318 -0
- fishr/audio/TelnyxAudio.py +217 -0
- fishr/audio/Transcode.py +145 -0
- fishr/audio/__init__.py +47 -0
- fishr/chat/__init__.py +3 -0
- fishr/chat/server.py +458 -0
- fishr/client/__init__.py +287 -0
- fishr/client/agents.py +199 -0
- fishr/client/audio.py +222 -0
- fishr/client/completions.py +913 -0
- fishr/client/images.py +94 -0
- fishr/client/routing.py +15 -0
- fishr/client/streams.py +482 -0
- fishr-0.0.1.dist-info/METADATA +154 -0
- fishr-0.0.1.dist-info/RECORD +35 -0
- fishr-0.0.1.dist-info/WHEEL +5 -0
- fishr-0.0.1.dist-info/entry_points.txt +2 -0
- fishr-0.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
from fishr.Base.DeepAI import DeepAI
|
|
2
|
+
from fishr.Base.DphnAI import DphnAI
|
|
3
|
+
from fishr.Base.Eris import Eris
|
|
4
|
+
from fishr.Base.NoTrack import NoTrack
|
|
5
|
+
from fishr.Base.Noxus import NoxusMessage
|
|
6
|
+
from fishr.Base.OperaAria import OperaAria
|
|
7
|
+
from fishr.Base.Quillbot import Quillbot
|
|
8
|
+
from fishr.Base.Telnyx import Telnyx
|
|
9
|
+
from fishr.Base.Yqcloud import Yqcloud
|
|
10
|
+
from fishr.Types import models as model_registry
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Conversation:
|
|
14
|
+
"""Sync multi-turn conversation with history.
|
|
15
|
+
|
|
16
|
+
Usage::
|
|
17
|
+
|
|
18
|
+
from fishr import Client
|
|
19
|
+
|
|
20
|
+
client = Client()
|
|
21
|
+
conv = client.conversation(model="noxus/openai")
|
|
22
|
+
|
|
23
|
+
conv.system("You are a helpful assistant.")
|
|
24
|
+
conv.ask("What is Python?")
|
|
25
|
+
conv.ask("Tell me more about that.")
|
|
26
|
+
|
|
27
|
+
# works with all providers
|
|
28
|
+
conv = client.conversation(model="deepai/standard")
|
|
29
|
+
conv.ask("Hello!")
|
|
30
|
+
|
|
31
|
+
conv = client.conversation(model="quillbot/quillbot")
|
|
32
|
+
conv.ask("Hello!")
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
__slots__ = (
|
|
36
|
+
"provider",
|
|
37
|
+
"provider_type",
|
|
38
|
+
"history",
|
|
39
|
+
"model",
|
|
40
|
+
"supports_history",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
def __init__(self, provider, model: str = "noxus/openai") -> None:
|
|
44
|
+
self.provider = provider
|
|
45
|
+
if isinstance(provider, DeepAI):
|
|
46
|
+
self.provider_type = "deepai"
|
|
47
|
+
elif isinstance(provider, DphnAI):
|
|
48
|
+
self.provider_type = "dphnai"
|
|
49
|
+
elif isinstance(provider, Quillbot):
|
|
50
|
+
self.provider_type = "quillbot"
|
|
51
|
+
elif isinstance(provider, NoTrack):
|
|
52
|
+
self.provider_type = "notrack"
|
|
53
|
+
elif isinstance(provider, Yqcloud):
|
|
54
|
+
self.provider_type = "yqcloud"
|
|
55
|
+
elif isinstance(provider, OperaAria):
|
|
56
|
+
self.provider_type = "opera"
|
|
57
|
+
elif isinstance(provider, Telnyx):
|
|
58
|
+
self.provider_type = "telnyx"
|
|
59
|
+
elif isinstance(provider, Eris):
|
|
60
|
+
self.provider_type = "eris"
|
|
61
|
+
else:
|
|
62
|
+
self.provider_type = "noxus"
|
|
63
|
+
self.model = model
|
|
64
|
+
self.history: list[NoxusMessage] = []
|
|
65
|
+
model_def = model_registry.get(model)
|
|
66
|
+
self.supports_history = model_def.history if model_def else True
|
|
67
|
+
|
|
68
|
+
def ask(self, prompt: str, **kwargs) -> str:
|
|
69
|
+
if self.provider_type == "deepai":
|
|
70
|
+
return self._ask_deepai(prompt, **kwargs)
|
|
71
|
+
if self.provider_type == "dphnai":
|
|
72
|
+
return self._ask_dphnai(prompt, **kwargs)
|
|
73
|
+
if self.provider_type == "quillbot":
|
|
74
|
+
return self._ask_quillbot(prompt, **kwargs)
|
|
75
|
+
if self.provider_type == "notrack":
|
|
76
|
+
return self._ask_notrack(prompt, **kwargs)
|
|
77
|
+
if self.provider_type == "yqcloud":
|
|
78
|
+
return self._ask_yqcloud(prompt, **kwargs)
|
|
79
|
+
if self.provider_type == "opera":
|
|
80
|
+
return self._ask_opera(prompt, **kwargs)
|
|
81
|
+
if self.provider_type == "telnyx":
|
|
82
|
+
return self._ask_telnyx(prompt, **kwargs)
|
|
83
|
+
if self.provider_type == "eris":
|
|
84
|
+
return self._ask_eris(prompt, **kwargs)
|
|
85
|
+
return self._ask_noxus(prompt, **kwargs)
|
|
86
|
+
|
|
87
|
+
def _ask_noxus(self, prompt: str, **kwargs) -> str:
|
|
88
|
+
user_msg = NoxusMessage(role="user", content=prompt)
|
|
89
|
+
self.history.append(user_msg)
|
|
90
|
+
if self.supports_history:
|
|
91
|
+
resp = self.provider.chat(tuple(self.history), model=self.model, **kwargs)
|
|
92
|
+
else:
|
|
93
|
+
resp = self.provider.chat((user_msg,), model=self.model, **kwargs)
|
|
94
|
+
assistant_msg = NoxusMessage(role="assistant", content=resp.content)
|
|
95
|
+
self.history.append(assistant_msg)
|
|
96
|
+
return resp.content
|
|
97
|
+
|
|
98
|
+
def _ask_deepai(self, prompt: str, **kwargs) -> str:
|
|
99
|
+
result = self.provider.ask(prompt, model=self.model, **kwargs)
|
|
100
|
+
content = result.image_url if result.image_url else result.content
|
|
101
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
102
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
103
|
+
return content
|
|
104
|
+
|
|
105
|
+
def _ask_quillbot(self, prompt: str, **kwargs) -> str:
|
|
106
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
107
|
+
messages.append({"role": "user", "content": prompt})
|
|
108
|
+
result = self.provider.chat(messages, model=self.model, **kwargs)
|
|
109
|
+
content = result.content
|
|
110
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
111
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
112
|
+
return content
|
|
113
|
+
|
|
114
|
+
def _ask_notrack(self, prompt: str, **kwargs) -> str:
|
|
115
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
116
|
+
messages.append({"role": "user", "content": prompt})
|
|
117
|
+
result = self.provider.chat(messages, model=self.model, **kwargs)
|
|
118
|
+
content = result.content
|
|
119
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
120
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
121
|
+
return content
|
|
122
|
+
|
|
123
|
+
def _ask_dphnai(self, prompt: str, **kwargs) -> str:
|
|
124
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
125
|
+
messages.append({"role": "user", "content": prompt})
|
|
126
|
+
result = self.provider.chat(messages, model=self.model, **kwargs)
|
|
127
|
+
content = result.content
|
|
128
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
129
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
130
|
+
return content
|
|
131
|
+
|
|
132
|
+
def _ask_yqcloud(self, prompt: str, **kwargs) -> str:
|
|
133
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
134
|
+
messages.append({"role": "user", "content": prompt})
|
|
135
|
+
result = self.provider.chat(messages, model=self.model, **kwargs)
|
|
136
|
+
content = result.content
|
|
137
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
138
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
139
|
+
return content
|
|
140
|
+
|
|
141
|
+
def _ask_opera(self, prompt: str, **kwargs) -> str:
|
|
142
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
143
|
+
messages.append({"role": "user", "content": prompt})
|
|
144
|
+
result = self.provider.chat(messages, model=self.model, **kwargs)
|
|
145
|
+
content = result.content
|
|
146
|
+
if result.image_urls:
|
|
147
|
+
content += "\n" + "\n".join(result.image_urls)
|
|
148
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
149
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
150
|
+
return content
|
|
151
|
+
|
|
152
|
+
def _ask_telnyx(self, prompt: str, **kwargs) -> str:
|
|
153
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
154
|
+
messages.append({"role": "user", "content": prompt})
|
|
155
|
+
result = self.provider.chat(messages, model=self.model, **kwargs)
|
|
156
|
+
content = result.content
|
|
157
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
158
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
159
|
+
return content
|
|
160
|
+
|
|
161
|
+
def _ask_eris(self, prompt: str, **kwargs) -> str:
|
|
162
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
163
|
+
messages.append({"role": "user", "content": prompt})
|
|
164
|
+
result = self.provider.chat(messages, model=self.model, **kwargs)
|
|
165
|
+
content = result.content
|
|
166
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
167
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
168
|
+
return content
|
|
169
|
+
|
|
170
|
+
def system(self, content: str) -> None:
|
|
171
|
+
self.history.append(NoxusMessage(role="system", content=content))
|
|
172
|
+
|
|
173
|
+
def clear(self) -> None:
|
|
174
|
+
self.history.clear()
|
|
175
|
+
if hasattr(self.provider, "new_chat"):
|
|
176
|
+
self.provider.new_chat()
|
|
177
|
+
|
|
178
|
+
def __len__(self) -> int:
|
|
179
|
+
return len(self.history)
|
|
180
|
+
|
|
181
|
+
def __enter__(self):
|
|
182
|
+
return self
|
|
183
|
+
|
|
184
|
+
def __exit__(self, *args) -> None:
|
|
185
|
+
pass
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class AsyncConversation:
|
|
189
|
+
"""Async multi-turn conversation with history.
|
|
190
|
+
|
|
191
|
+
Usage::
|
|
192
|
+
|
|
193
|
+
```py
|
|
194
|
+
from fishr import AsyncClient
|
|
195
|
+
|
|
196
|
+
client = AsyncClient()
|
|
197
|
+
conv = client.conversation(model="noxus/openai")
|
|
198
|
+
|
|
199
|
+
await conv.ask("What is Python?")
|
|
200
|
+
await conv.ask("Tell me more about that.")```
|
|
201
|
+
"""
|
|
202
|
+
|
|
203
|
+
__slots__ = (
|
|
204
|
+
"provider",
|
|
205
|
+
"provider_type",
|
|
206
|
+
"history",
|
|
207
|
+
"model",
|
|
208
|
+
"supports_history",
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
def __init__(self, provider, model: str = "noxus/openai") -> None:
|
|
212
|
+
self.provider = provider
|
|
213
|
+
if isinstance(provider, DeepAI):
|
|
214
|
+
self.provider_type = "deepai"
|
|
215
|
+
elif isinstance(provider, DphnAI):
|
|
216
|
+
self.provider_type = "dphnai"
|
|
217
|
+
elif isinstance(provider, Quillbot):
|
|
218
|
+
self.provider_type = "quillbot"
|
|
219
|
+
elif isinstance(provider, NoTrack):
|
|
220
|
+
self.provider_type = "notrack"
|
|
221
|
+
elif isinstance(provider, Yqcloud):
|
|
222
|
+
self.provider_type = "yqcloud"
|
|
223
|
+
elif isinstance(provider, OperaAria):
|
|
224
|
+
self.provider_type = "opera"
|
|
225
|
+
elif isinstance(provider, Telnyx):
|
|
226
|
+
self.provider_type = "telnyx"
|
|
227
|
+
elif isinstance(provider, Eris):
|
|
228
|
+
self.provider_type = "eris"
|
|
229
|
+
else:
|
|
230
|
+
self.provider_type = "noxus"
|
|
231
|
+
self.model = model
|
|
232
|
+
self.history: list[NoxusMessage] = []
|
|
233
|
+
model_def = model_registry.get(model)
|
|
234
|
+
self.supports_history = model_def.history if model_def else True
|
|
235
|
+
|
|
236
|
+
async def ask(self, prompt: str, **kwargs) -> str:
|
|
237
|
+
if self.provider_type == "deepai":
|
|
238
|
+
return await self._ask_deepai(prompt, **kwargs)
|
|
239
|
+
if self.provider_type == "dphnai":
|
|
240
|
+
return await self._ask_dphnai(prompt, **kwargs)
|
|
241
|
+
if self.provider_type == "quillbot":
|
|
242
|
+
return await self._ask_quillbot(prompt, **kwargs)
|
|
243
|
+
if self.provider_type == "notrack":
|
|
244
|
+
return await self._ask_notrack(prompt, **kwargs)
|
|
245
|
+
if self.provider_type == "yqcloud":
|
|
246
|
+
return await self._ask_yqcloud(prompt, **kwargs)
|
|
247
|
+
if self.provider_type == "opera":
|
|
248
|
+
return await self._ask_opera(prompt, **kwargs)
|
|
249
|
+
if self.provider_type == "telnyx":
|
|
250
|
+
return await self._ask_telnyx(prompt, **kwargs)
|
|
251
|
+
if self.provider_type == "eris":
|
|
252
|
+
return await self._ask_eris(prompt, **kwargs)
|
|
253
|
+
return await self._ask_noxus(prompt, **kwargs)
|
|
254
|
+
|
|
255
|
+
async def _ask_noxus(self, prompt: str, **kwargs) -> str:
|
|
256
|
+
user_msg = NoxusMessage(role="user", content=prompt)
|
|
257
|
+
self.history.append(user_msg)
|
|
258
|
+
if self.supports_history:
|
|
259
|
+
resp = await self.provider.chat_async(
|
|
260
|
+
tuple(self.history),
|
|
261
|
+
model=self.model,
|
|
262
|
+
**kwargs,
|
|
263
|
+
)
|
|
264
|
+
else:
|
|
265
|
+
resp = await self.provider.chat_async(
|
|
266
|
+
(user_msg,),
|
|
267
|
+
model=self.model,
|
|
268
|
+
**kwargs,
|
|
269
|
+
)
|
|
270
|
+
assistant_msg = NoxusMessage(role="assistant", content=resp.content)
|
|
271
|
+
self.history.append(assistant_msg)
|
|
272
|
+
return resp.content
|
|
273
|
+
|
|
274
|
+
async def _ask_deepai(self, prompt: str, **kwargs) -> str:
|
|
275
|
+
result = await self.provider.ask_async(prompt, model=self.model, **kwargs)
|
|
276
|
+
content = result.image_url if result.image_url else result.content
|
|
277
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
278
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
279
|
+
return content
|
|
280
|
+
|
|
281
|
+
async def _ask_quillbot(self, prompt: str, **kwargs) -> str:
|
|
282
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
283
|
+
messages.append({"role": "user", "content": prompt})
|
|
284
|
+
result = await self.provider.chat_async(
|
|
285
|
+
messages,
|
|
286
|
+
model=self.model,
|
|
287
|
+
**kwargs,
|
|
288
|
+
)
|
|
289
|
+
content = result.content
|
|
290
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
291
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
292
|
+
return content
|
|
293
|
+
|
|
294
|
+
async def _ask_notrack(self, prompt: str, **kwargs) -> str:
|
|
295
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
296
|
+
messages.append({"role": "user", "content": prompt})
|
|
297
|
+
result = await self.provider.chat_async(
|
|
298
|
+
messages,
|
|
299
|
+
model=self.model,
|
|
300
|
+
**kwargs,
|
|
301
|
+
)
|
|
302
|
+
content = result.content
|
|
303
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
304
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
305
|
+
return content
|
|
306
|
+
|
|
307
|
+
async def _ask_dphnai(self, prompt: str, **kwargs) -> str:
|
|
308
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
309
|
+
messages.append({"role": "user", "content": prompt})
|
|
310
|
+
result = await self.provider.chat_async(
|
|
311
|
+
messages,
|
|
312
|
+
model=self.model,
|
|
313
|
+
**kwargs,
|
|
314
|
+
)
|
|
315
|
+
content = result.content
|
|
316
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
317
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
318
|
+
return content
|
|
319
|
+
|
|
320
|
+
async def _ask_yqcloud(self, prompt: str, **kwargs) -> str:
|
|
321
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
322
|
+
messages.append({"role": "user", "content": prompt})
|
|
323
|
+
result = await self.provider.chat_async(
|
|
324
|
+
messages,
|
|
325
|
+
model=self.model,
|
|
326
|
+
**kwargs,
|
|
327
|
+
)
|
|
328
|
+
content = result.content
|
|
329
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
330
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
331
|
+
return content
|
|
332
|
+
|
|
333
|
+
async def _ask_opera(self, prompt: str, **kwargs) -> str:
|
|
334
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
335
|
+
messages.append({"role": "user", "content": prompt})
|
|
336
|
+
result = await self.provider.chat_async(
|
|
337
|
+
messages,
|
|
338
|
+
model=self.model,
|
|
339
|
+
**kwargs,
|
|
340
|
+
)
|
|
341
|
+
content = result.content
|
|
342
|
+
if result.image_urls:
|
|
343
|
+
content += "\n" + "\n".join(result.image_urls)
|
|
344
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
345
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
346
|
+
return content
|
|
347
|
+
|
|
348
|
+
async def _ask_telnyx(self, prompt: str, **kwargs) -> str:
|
|
349
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
350
|
+
messages.append({"role": "user", "content": prompt})
|
|
351
|
+
result = await self.provider.chat_async(
|
|
352
|
+
messages,
|
|
353
|
+
model=self.model,
|
|
354
|
+
**kwargs,
|
|
355
|
+
)
|
|
356
|
+
content = result.content
|
|
357
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
358
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
359
|
+
return content
|
|
360
|
+
|
|
361
|
+
async def _ask_eris(self, prompt: str, **kwargs) -> str:
|
|
362
|
+
messages = [{"role": m.role, "content": m.content} for m in self.history]
|
|
363
|
+
messages.append({"role": "user", "content": prompt})
|
|
364
|
+
result = await self.provider.chat_async(
|
|
365
|
+
messages,
|
|
366
|
+
model=self.model,
|
|
367
|
+
**kwargs,
|
|
368
|
+
)
|
|
369
|
+
content = result.content
|
|
370
|
+
self.history.append(NoxusMessage(role="user", content=prompt))
|
|
371
|
+
self.history.append(NoxusMessage(role="assistant", content=content))
|
|
372
|
+
return content
|
|
373
|
+
|
|
374
|
+
def system(self, content: str) -> None:
|
|
375
|
+
self.history.append(NoxusMessage(role="system", content=content))
|
|
376
|
+
|
|
377
|
+
def clear(self) -> None:
|
|
378
|
+
self.history.clear()
|
|
379
|
+
if hasattr(self.provider, "new_chat"):
|
|
380
|
+
self.provider.new_chat()
|
|
381
|
+
|
|
382
|
+
def __len__(self) -> int:
|
|
383
|
+
return len(self.history)
|
|
384
|
+
|
|
385
|
+
async def __aenter__(self):
|
|
386
|
+
return self
|
|
387
|
+
|
|
388
|
+
async def __aexit__(self, *args) -> None:
|
|
389
|
+
pass
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
__all__ = [
|
|
393
|
+
"Conversation",
|
|
394
|
+
"AsyncConversation",
|
|
395
|
+
]
|