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.
@@ -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
+ ]