davidkhala.ai 0.0.4__tar.gz → 0.0.6__tar.gz

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.
Files changed (20) hide show
  1. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/PKG-INFO +1 -1
  2. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/api/__init__.py +2 -1
  3. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/api/openrouter.py +22 -12
  4. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/pyproject.toml +1 -1
  5. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/.gitignore +0 -0
  6. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/README.md +0 -0
  7. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/__init__.py +0 -0
  8. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/agent/__init__.py +0 -0
  9. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/agent/langgraph.py +0 -0
  10. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/ali/__init__.py +0 -0
  11. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/ali/dashscope.py +0 -0
  12. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/api/siliconflow.py +0 -0
  13. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/google/__init__.py +0 -0
  14. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/google/adk.py +0 -0
  15. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/google/gemini.py +0 -0
  16. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/model.py +0 -0
  17. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/openai/__init__.py +0 -0
  18. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/openai/azure.py +0 -0
  19. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/openai/native.py +0 -0
  20. {davidkhala_ai-0.0.4 → davidkhala_ai-0.0.6}/davidkhala/ai/opik.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: davidkhala.ai
3
- Version: 0.0.4
3
+ Version: 0.0.6
4
4
  Summary: misc AI modules
5
5
  Requires-Python: >=3.13
6
6
  Provides-Extra: ali
@@ -38,7 +38,8 @@ class API(AbstractClient):
38
38
  "meta": {
39
39
  "usage": response['usage'],
40
40
  "created": datetime.datetime.fromtimestamp(response['created'])
41
- }
41
+ },
42
+ 'model': response['model'],
42
43
  }
43
44
 
44
45
  def list_models(self):
@@ -1,9 +1,12 @@
1
+ import time
2
+
1
3
  import requests
2
4
  from davidkhala.http_request import default_on_response
3
- from requests import HTTPError, Response
5
+ from requests import Response
4
6
 
5
7
  from davidkhala.ai.api import API
6
8
 
9
+
7
10
  class OpenRouter(API):
8
11
  @property
9
12
  def free_models(self) -> list[str]:
@@ -20,11 +23,11 @@ class OpenRouter(API):
20
23
  err = r.get('error')
21
24
  if err:
22
25
  derived_response = Response()
23
- derived_response.status_code = err.pop('code', None)
24
- derived_response._content = err.pop('message', None)
25
- http_err = HTTPError(response=derived_response)
26
- http_err.metadata = err.get("metadata")
27
- raise http_err
26
+ derived_response.status_code = err['code']
27
+ derived_response.reason = err['message']
28
+ derived_response.metadata = err.get("metadata")
29
+
30
+ derived_response.raise_for_status()
28
31
  return r
29
32
 
30
33
  def __init__(self, api_key: str, *models: str, **kwargs):
@@ -36,16 +39,23 @@ class OpenRouter(API):
36
39
  'url'] # Site URL for rankings on openrouter.ai.
37
40
  self._.options["headers"]["X-Title"] = kwargs['leaderboard'][
38
41
  'name'] # Site title for rankings on openrouter.ai.
39
- if not models:
40
- models = [self.free_models[0]]
41
42
  self.models = models
42
43
 
43
44
  self._.on_response = OpenRouter.on_response
44
45
 
45
46
  def chat(self, *user_prompt: str, **kwargs):
46
- if len(self.models) > 1:
47
+ if self.models:
47
48
  kwargs["models"] = self.models
48
49
  else:
49
- kwargs["model"] = self.models[0]
50
-
51
- return super().chat(*user_prompt, **kwargs)
50
+ kwargs["model"] = self.model
51
+
52
+ try:
53
+ r = super().chat(*user_prompt, **kwargs)
54
+ except requests.HTTPError as e:
55
+ if e.response.status_code == 429 and kwargs.get('retry'):
56
+ time.sleep(1)
57
+ return self.chat(*user_prompt, **kwargs)
58
+ else: raise
59
+ if self.models:
60
+ assert r['model'] in self.models
61
+ return r
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "davidkhala.ai"
3
- version = "0.0.4"
3
+ version = "0.0.6"
4
4
  description = "misc AI modules"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
File without changes
File without changes