davidkhala.ai 0.2.1__py3-none-any.whl → 0.2.2__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.
Files changed (52) hide show
  1. davidkhala/ai/agent/dify/api/__init__.py +2 -2
  2. davidkhala/ai/agent/dify/api/app.py +10 -6
  3. davidkhala/ai/agent/dify/api/knowledge/__init__.py +0 -0
  4. davidkhala/ai/agent/dify/api/knowledge/chunk.py +14 -0
  5. davidkhala/ai/agent/dify/api/knowledge/dataset.py +82 -0
  6. davidkhala/ai/agent/dify/api/knowledge/document.py +42 -0
  7. davidkhala/ai/agent/dify/api/knowledge/model.py +139 -0
  8. davidkhala/ai/agent/dify/{ops/console → console}/__init__.py +7 -1
  9. davidkhala/ai/agent/dify/console/knowledge/__init__.py +0 -0
  10. davidkhala/ai/agent/dify/console/knowledge/dataset.py +61 -0
  11. davidkhala/ai/agent/dify/console/knowledge/pipeline.py +127 -0
  12. davidkhala/ai/agent/dify/{ops/console → console}/plugin.py +20 -6
  13. davidkhala/ai/agent/dify/console/session.py +50 -0
  14. davidkhala/ai/agent/dify/db/orm.py +65 -0
  15. davidkhala/ai/agent/dify/model/__init__.py +7 -0
  16. davidkhala/ai/agent/dify/{model.py → model/knowledge.py} +1 -12
  17. davidkhala/ai/agent/dify/{ops/db/orm.py → model/workflow.py} +24 -62
  18. davidkhala/ai/agent/langgraph.py +1 -1
  19. davidkhala/ai/ali/dashscope.py +15 -14
  20. davidkhala/ai/anthropic/__init__.py +6 -0
  21. davidkhala/ai/api/__init__.py +6 -19
  22. davidkhala/ai/api/openrouter.py +14 -10
  23. davidkhala/ai/api/siliconflow.py +2 -4
  24. davidkhala/ai/atlas/__init__.py +24 -0
  25. davidkhala/ai/mistral/__init__.py +2 -20
  26. davidkhala/ai/mistral/agent.py +50 -0
  27. davidkhala/ai/mistral/ai.py +40 -0
  28. davidkhala/ai/mistral/file.py +38 -0
  29. davidkhala/ai/mistral/ocr.py +46 -0
  30. davidkhala/ai/model/__init__.py +11 -27
  31. davidkhala/ai/model/chat.py +60 -4
  32. davidkhala/ai/model/embed.py +8 -0
  33. davidkhala/ai/model/garden.py +9 -0
  34. davidkhala/ai/openai/__init__.py +9 -33
  35. davidkhala/ai/openai/azure.py +51 -0
  36. davidkhala/ai/openai/native.py +2 -3
  37. davidkhala/ai/openrouter/__init__.py +24 -13
  38. {davidkhala_ai-0.2.1.dist-info → davidkhala_ai-0.2.2.dist-info}/METADATA +8 -6
  39. davidkhala_ai-0.2.2.dist-info/RECORD +65 -0
  40. davidkhala/ai/agent/dify/api/knowledge.py +0 -191
  41. davidkhala/ai/agent/dify/ops/__init__.py +0 -1
  42. davidkhala/ai/agent/dify/ops/console/knowledge.py +0 -158
  43. davidkhala/ai/agent/dify/ops/console/session.py +0 -32
  44. davidkhala/ai/huggingface/BAAI.py +0 -10
  45. davidkhala/ai/huggingface/__init__.py +0 -21
  46. davidkhala/ai/huggingface/inference.py +0 -13
  47. davidkhala_ai-0.2.1.dist-info/RECORD +0 -53
  48. /davidkhala/ai/agent/dify/{ops/db → db}/__init__.py +0 -0
  49. /davidkhala/ai/agent/dify/{ops/db → db}/app.py +0 -0
  50. /davidkhala/ai/agent/dify/{ops/db → db}/knowledge.py +0 -0
  51. /davidkhala/ai/agent/dify/{ops/db → db}/sys.py +0 -0
  52. {davidkhala_ai-0.2.1.dist-info → davidkhala_ai-0.2.2.dist-info}/WHEEL +0 -0
@@ -1,158 +0,0 @@
1
- from time import sleep
2
-
3
- from davidkhala.utils.http_request.stream import as_sse, Request as StreamRequest
4
- from pydantic import BaseModel
5
-
6
- from davidkhala.ai.agent.dify.interface import IndexingError
7
- from davidkhala.ai.agent.dify.model import Document, Dataset
8
- from davidkhala.ai.agent.dify.const import IndexingStatus
9
- from davidkhala.ai.agent.dify.ops.console import API
10
- from davidkhala.ai.agent.dify.ops.console.session import ConsoleUser
11
- from davidkhala.ai.agent.dify.ops.db.orm import Node
12
-
13
-
14
- class ConsoleKnowledge(API):
15
- def __init__(self, context: ConsoleUser):
16
- super().__init__()
17
- self.base_url = context.base_url
18
- self.session.cookies = context.session.cookies
19
- self.options = context.options
20
-
21
-
22
- class Datasource(ConsoleKnowledge):
23
- """step 1: Choose a Data Source"""
24
-
25
- class FirecrawlOutput(BaseModel):
26
- source_url: str
27
- description: str
28
- title: str
29
- credential_id: str
30
- content: str
31
-
32
- def run_firecrawl(self, pipeline: str, node: Node,
33
- *,
34
- inputs: dict,
35
- credential_id: str
36
- ):
37
-
38
- url = f"{self.base_url}/rag/pipelines/{pipeline}/workflows/published/datasource/nodes/{node.id}/run"
39
-
40
- stream_request = StreamRequest(self)
41
- response = stream_request.request(url, 'POST', json={
42
- 'inputs': inputs,
43
- 'datasource_type': node.datasource_type,
44
- 'credential_id': credential_id,
45
- "response_mode": "streaming"
46
- })
47
-
48
- for data in as_sse(response):
49
- event = data['event']
50
- if event == 'datasource_completed':
51
- return data['data']
52
- else:
53
- assert event == 'datasource_processing'
54
- print(data)
55
- return None
56
-
57
- def upload(self):
58
- "http://localhost/console/api/files/upload?source=datasets"
59
- # TODO
60
- "form data"
61
- {
62
- "file": "body"
63
- }
64
- r = {
65
- "id": "3898db5b-eb72-4f11-b507-628ad5d28887",
66
- "name": "Professional Diploma Meister Power Electrical Engineering - Technological and Higher Education Institute of Hong Kong.html",
67
- "size": 254362,
68
- "extension": "html",
69
- "mime_type": "text\/html",
70
- "created_by": "dbd0b38b-5ef1-4123-8c3f-0c82eb1feacd",
71
- "created_at": 1764943811,
72
- "source_url": "\/files\/3898db5b-eb72-4f11-b507-628ad5d28887\/file-preview?timestamp=1764943811&nonce=43b0ff5a13372415be79de4cc7ef398c&sign=7OJ2wiVYc4tygl7yvM1sPn7s0WXDlhHxgX76bsGTD94%3D"
73
- }
74
-
75
-
76
- class Operation(ConsoleKnowledge):
77
- def website_sync(self, dataset: str, document: str, *, wait_until=True):
78
- """
79
- cannot be used towards a pipeline dataset. Otherwise, you will see error "no website import info found"
80
- """
81
- doc_url = f"{self.base_url}/datasets/{dataset}/documents/{document}"
82
-
83
- r = self.request(f"{doc_url}/website-sync", "GET")
84
- assert r == {"result": "success"}
85
- if wait_until:
86
- return self.wait_until(dataset, document)
87
- return None
88
-
89
- def retry(self, dataset: str, *documents: str, wait_until=True):
90
- """
91
- It cannot trigger rerun on success documents
92
- """
93
- url = f"{self.base_url}/datasets/{dataset}/retry"
94
- self.request(url, "POST", json={
95
- 'document_ids': documents,
96
- })
97
- # response status code will be 204
98
- if wait_until:
99
- return [self.wait_until(dataset, document) for document in documents]
100
- return None
101
-
102
- def rerun(self, dataset: str, *documents: str):
103
- for document in documents:
104
- try:
105
- self.website_sync(dataset, document)
106
- assert False, "expect IndexingError"
107
- except IndexingError:
108
- pass
109
- return self.retry(dataset, *documents)
110
-
111
- def wait_until(self, dataset: str, document: str, *,
112
- expect_status=None,
113
- from_status=None,
114
- interval=1
115
- ):
116
- if not expect_status:
117
- expect_status = [IndexingStatus.FAILED, IndexingStatus.COMPLETED]
118
- url = f"{self.base_url}/datasets/{dataset}/documents/{document}/indexing-status"
119
- if from_status is None:
120
- from_status = [IndexingStatus.WAITING, IndexingStatus.PARSING]
121
- r = self.request(url, "GET")
122
- status = r['indexing_status']
123
- assert status in from_status, f"current status: {status}, expect: {from_status}"
124
- while status not in expect_status:
125
- sleep(interval)
126
- r = self.request(url, "GET")
127
- status = r['indexing_status']
128
- if status == IndexingStatus.FAILED: raise IndexingError(r['error'])
129
- return r
130
-
131
-
132
- class DatasetResult(Dataset):
133
- chunk_structure: str
134
-
135
- class RunResult(BaseModel):
136
- batch: str
137
- dataset: DatasetResult
138
- documents: list[Document]
139
-
140
- class Load(ConsoleKnowledge):
141
- """
142
- Processing Documents
143
- """
144
-
145
- def async_run(self, pipeline: str, node: Node, inputs: dict, datasource_info_list: list[dict])->RunResult:
146
- """Ingest new document"""
147
- url = f"{self.base_url}/rag/pipelines/{pipeline}/workflows/published/run"
148
- r = self.request(url, "POST", json={
149
- 'inputs': inputs,
150
- 'start_node_id': node.id,
151
- 'is_preview': False,
152
- 'response_mode': "blocking",
153
- "datasource_info_list": datasource_info_list,
154
- 'datasource_type': node.datasource_type
155
- })
156
- return RunResult(**r)
157
-
158
-
@@ -1,32 +0,0 @@
1
- from base64 import b64encode
2
-
3
- from davidkhala.ai.agent.dify.ops.console import API
4
-
5
-
6
- class ConsoleUser(API):
7
- def login(self, email, password,
8
- *,
9
- remember_me=True,
10
- language="en-US"
11
- ):
12
- url = f"{self.base_url}/login"
13
-
14
- r = self.request(url, "POST", json={
15
- 'email': email,
16
- 'password': b64encode(password.encode()).decode(), # use base64 from dify 1.11
17
- 'remember_me': remember_me,
18
- 'language': language,
19
- })
20
- assert r == {"result": "success"}
21
- self.options['headers']['x-csrf-token'] = self.session.cookies.get("csrf_token")
22
- return self.session.cookies
23
-
24
- @property
25
- def me(self) -> dict:
26
- url = f"{self.base_url}/account/profile"
27
- return self.request(url, "GET")
28
-
29
- @property
30
- def workspace(self) -> dict:
31
- url = f"{self.base_url}/features"
32
- return self.request(url, "GET")
@@ -1,10 +0,0 @@
1
- import os
2
-
3
- from davidkhala.ai.huggingface import clone
4
- from pathlib import Path
5
-
6
- def bge_m3_path(git_dir: os.PathLike):
7
- model_dir = clone(git_dir, repo_id="BAAI/bge-m3",allow_patterns=["onnx/*"])
8
- onnx_path = Path(model_dir) / "onnx" / "model.onnx"
9
- assert onnx_path.is_file() and onnx_path.exists()
10
- return onnx_path
@@ -1,21 +0,0 @@
1
- import os
2
- from typing import Optional
3
-
4
- from huggingface_hub import snapshot_download
5
-
6
-
7
- def clone(git_dir: os.PathLike,
8
- *,
9
- owner: Optional[str] = None,
10
- repository: Optional[str] = None,
11
- repo_id: Optional[str] = None,
12
- **kwargs
13
- ) -> str:
14
- if not repo_id:
15
- repo_id = f"{owner}/{repository}"
16
- return snapshot_download(
17
- repo_id=repo_id,
18
- local_dir=git_dir,
19
- local_dir_use_symlinks=False,
20
- **kwargs
21
- )
@@ -1,13 +0,0 @@
1
- from huggingface_hub import InferenceApi
2
-
3
-
4
- class API:
5
- def __init__(self, token):
6
- self.inference = None
7
- self.token = token
8
-
9
- def as_model(self, repo_id):
10
- self.inference = InferenceApi(repo_id=repo_id, token=self.token)
11
-
12
- def call(self, **kwargs):
13
- return self.inference(**kwargs)
@@ -1,53 +0,0 @@
1
- davidkhala/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- davidkhala/ai/opik.py,sha256=YU1XuweMUAzUkhpjxhltt-SBBDBkR3z-PCNo0DqzBRs,39
3
- davidkhala/ai/you.py,sha256=fmMfJQZcG0e6sKfVQy2jOKZ-jkO-3H6GOGP2U19l4zQ,1759
4
- davidkhala/ai/agent/README.md,sha256=kIPsx3gOjrpOw7w2qhNEALuCEQkuh4nYp6uBnijdvHE,178
5
- davidkhala/ai/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- davidkhala/ai/agent/langgraph.py,sha256=jrc_Yvgo7eJjd3y5UJn0t1FzpnObDGYscwgsuVl2O_I,1052
7
- davidkhala/ai/agent/ragflow.py,sha256=UaK31us6V0NhAPCthGo07rQsm72vlR-McmihC_NDe1g,273
8
- davidkhala/ai/agent/dify/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- davidkhala/ai/agent/dify/const.py,sha256=gU4lPBe4U2taakN2jhdPMRWXkqlyCg-YRE8JJmtsblo,218
10
- davidkhala/ai/agent/dify/interface.py,sha256=bTOI38ZjtkgoSw-ysgFwBZ1QkKVAa92gjOnERDoagQA,118
11
- davidkhala/ai/agent/dify/model.py,sha256=1LEwKWWkFNmhbBWABEu7I45DRZ_BFGDP5uTHDrvldoo,641
12
- davidkhala/ai/agent/dify/api/__init__.py,sha256=9-8OesuXF_wPmPrh_gEZpEZP51dcZxb0i6ixOBYKcwQ,876
13
- davidkhala/ai/agent/dify/api/app.py,sha256=y1mILC-fvQpeH50ASbFBluD9tFAwXu_IWwtwucMV5jM,3801
14
- davidkhala/ai/agent/dify/api/knowledge.py,sha256=5ePqvzjBHNtQ64Dzt39wBWedYVeQJc23syNe9LFnGw8,5960
15
- davidkhala/ai/agent/dify/ops/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
16
- davidkhala/ai/agent/dify/ops/console/__init__.py,sha256=-a81jgCJ3s2B3i1GQ7ge1aZRfbvlALwGDHVu_GEET-A,237
17
- davidkhala/ai/agent/dify/ops/console/knowledge.py,sha256=I1v0iE_b4VPc2Zsyt4ci_oX080Qbgn3oXObP4uVEphg,5788
18
- davidkhala/ai/agent/dify/ops/console/plugin.py,sha256=ZVi6KitSQTNvOd2mOAKYEPhjyOaGjtaaK-8VGFFooBY,2360
19
- davidkhala/ai/agent/dify/ops/console/session.py,sha256=9IIdQqtTuYrc7QI9XpZxrCMb-K3m6QWH5FlsckSGCgg,991
20
- davidkhala/ai/agent/dify/ops/db/__init__.py,sha256=HYfJEnoFAoJJck2xvTDYx8zpw9Qao7sHXOGvW0diPqw,517
21
- davidkhala/ai/agent/dify/ops/db/app.py,sha256=IRiSiR0v387p4p3J7M9xEkJ7pfQyO5DL6chpx7Z2IzA,1319
22
- davidkhala/ai/agent/dify/ops/db/knowledge.py,sha256=GVaK5QmU_VxB8fDxV60uiYiIeR3JEn3IXJTlJHLiT5U,2917
23
- davidkhala/ai/agent/dify/ops/db/orm.py,sha256=CnZj8mV2RZhw_7hF1YICTUjROQ66hR5_8OCMQvtujnY,4575
24
- davidkhala/ai/agent/dify/ops/db/sys.py,sha256=U_qqopUMlgsilhHaG_ids6gtd-pNiR_Jm0kAr9hIL7M,188
25
- davidkhala/ai/agent/dify/plugins/__init__.py,sha256=iTWvutlkN9bXgptesi05M447nTeF5hKFAIfn4EviFj0,183
26
- davidkhala/ai/agent/dify/plugins/file.py,sha256=o-HjHSFwRTNIYs8IxqZUSnBbh-xr8f-xMUM3iU9wCCQ,390
27
- davidkhala/ai/agent/dify/plugins/firecrawl.py,sha256=lB_f8W_bdg-7PeBKmF0-HdwYyakV_0D3nET5iT-Z1KM,460
28
- davidkhala/ai/agent/dify/plugins/jina.py,sha256=dQ5iJxDLWtChXb1IjCtsHctgUtgjOiDfWOuR2u0aUIM,190
29
- davidkhala/ai/agent/dify/plugins/popular.py,sha256=XMuxqRcIko4gCQORg5HCcwCrbgLcaoRZxCYBIgtkrOo,812
30
- davidkhala/ai/ali/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- davidkhala/ai/ali/agentbay.py,sha256=O5t71GGwtDgBE1zUXJDYe5djMVwSaNOwn5k8zg1xa18,1200
32
- davidkhala/ai/ali/dashscope.py,sha256=3Dw-gxwO3iX6Z5_FdpkoNkwVmtXCLxklbOUcNCBzs_E,1945
33
- davidkhala/ai/api/__init__.py,sha256=0uV1lFUiKYa7Xk-DEsYN22KkqR1a_aItqfdoZzfu1IA,1363
34
- davidkhala/ai/api/openrouter.py,sha256=khccJr5cBnudFy6Jc2O3A1TNCuHH_5W6Q2tXrkwlUYE,2308
35
- davidkhala/ai/api/siliconflow.py,sha256=JbnOSv8LJLtwYSNNB8_SMBMQzOgHDtQYZKA9A2BC4sY,2139
36
- davidkhala/ai/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- davidkhala/ai/google/adk.py,sha256=QwxYoOzT2Hol03V4NM0PF_HAzUGb4fB18VUAYacYbAY,657
38
- davidkhala/ai/google/gemini.py,sha256=Xf4HDOOcK4-jEBERzuLnQNFsU61P2fFx4K0z-ijvNHE,214
39
- davidkhala/ai/huggingface/BAAI.py,sha256=LZ9kp5Gfql4UzuTn4osyekI6VV1H3RIfED2IolXFj5c,341
40
- davidkhala/ai/huggingface/__init__.py,sha256=FJyU8eOfWQWKAvkIa5qwubF9ghsSQ8C0e6p6DKyomgs,521
41
- davidkhala/ai/huggingface/inference.py,sha256=bYN0PtLF2CaIHzdTP4LaTALJhcawvuLnLR7rhMVqwDE,333
42
- davidkhala/ai/mistral/__init__.py,sha256=CFkTdRsVYZTIHpQRp-T9Dyx7K4RDYHzJokQkLDuJKdY,1090
43
- davidkhala/ai/model/__init__.py,sha256=2gnScjS2X3vaYdXCmXCwhzXu8vgXWWn_GIsfsDFDbuU,964
44
- davidkhala/ai/model/chat.py,sha256=2QEyM-9OFGRpcjsj6BTws3yiWixhzC_4x4HEh4ywhDM,409
45
- davidkhala/ai/openai/__init__.py,sha256=LIb_2Ipk55aalYt88VkaHz97PzKSP7567rZxIjznb6Y,2044
46
- davidkhala/ai/openai/azure.py,sha256=noO_tzoAhnyVVfFQ_kQhohqEG2XPlehyB-uT1leQLDk,1148
47
- davidkhala/ai/openai/databricks.py,sha256=Z_ES3KlZuwMjMiGnlAxxrirLInQRVXj2KZs32MHXBbI,736
48
- davidkhala/ai/openai/native.py,sha256=aQNjsls4kvoVGpytha9mMuC8KZ1OC5yKoO_WZzLBoyg,710
49
- davidkhala/ai/openai/opik.py,sha256=ovodFNDoDO_ygX8_EmeqbZcu8PRTntzsNNQg4JoZKWo,257
50
- davidkhala/ai/openrouter/__init__.py,sha256=hOe19DGhapvu4bh4y8URevC-PHb-0lb0R8kKEwj7LfQ,1065
51
- davidkhala_ai-0.2.1.dist-info/METADATA,sha256=zwtKDpHzWKDlBoa_IYmPDE4OmuMrJ3-X6WJO4Qxnvec,1737
52
- davidkhala_ai-0.2.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
53
- davidkhala_ai-0.2.1.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes