aksesai 0.1.0__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.
- aksesai-0.1.0/PKG-INFO +138 -0
- aksesai-0.1.0/README.md +109 -0
- aksesai-0.1.0/aksesai/__init__.py +10 -0
- aksesai-0.1.0/aksesai/client.py +282 -0
- aksesai-0.1.0/aksesai.egg-info/PKG-INFO +138 -0
- aksesai-0.1.0/aksesai.egg-info/SOURCES.txt +9 -0
- aksesai-0.1.0/aksesai.egg-info/dependency_links.txt +1 -0
- aksesai-0.1.0/aksesai.egg-info/requires.txt +7 -0
- aksesai-0.1.0/aksesai.egg-info/top_level.txt +2 -0
- aksesai-0.1.0/pyproject.toml +41 -0
- aksesai-0.1.0/setup.cfg +4 -0
aksesai-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aksesai
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python SDK untuk AksesAI — AI API Gateway Indonesia. 35+ model AI, bayar QRIS, tanpa kartu kredit.
|
|
5
|
+
Author-email: AksesAI <support@aksesai.id>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://aksesai.id
|
|
8
|
+
Project-URL: Documentation, https://aksesai.id/#docs
|
|
9
|
+
Project-URL: Repository, https://github.com/aksesai/aksesai-python
|
|
10
|
+
Project-URL: Dashboard, https://aksesai.id/dashboard
|
|
11
|
+
Keywords: ai,openai,llm,indonesia,chatgpt,claude,gemini,deepseek
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: openai>=1.0.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest; extra == "dev"
|
|
26
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
27
|
+
Requires-Dist: black; extra == "dev"
|
|
28
|
+
Requires-Dist: ruff; extra == "dev"
|
|
29
|
+
|
|
30
|
+
# AksesAI Python SDK
|
|
31
|
+
|
|
32
|
+
**Satu baris, langsung akses 35+ model AI.**
|
|
33
|
+
GPT, Claude, Gemini, DeepSeek — semua dalam Rupiah, tanpa kartu kredit.
|
|
34
|
+
|
|
35
|
+
[](https://pypi.org/project/aksesai/)
|
|
36
|
+
[](LICENSE)
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install aksesai
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Quick Start
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
from aksesai import AksesAI
|
|
50
|
+
|
|
51
|
+
# Dapetin API key: https://aksesai.id/dashboard
|
|
52
|
+
ai = AksesAI("sk-xxxx")
|
|
53
|
+
|
|
54
|
+
# Chat biasa
|
|
55
|
+
print(ai.chat("Jelaskan AI dalam satu kalimat"))
|
|
56
|
+
|
|
57
|
+
# Pilih model
|
|
58
|
+
print(ai.chat("Buat puisi tentang Indonesia", model="claude-sonnet-4-6"))
|
|
59
|
+
|
|
60
|
+
# Streaming (kata per kata)
|
|
61
|
+
for chunk in ai.chat_stream("Ceritakan sejarah Jakarta"):
|
|
62
|
+
print(chunk, end="")
|
|
63
|
+
|
|
64
|
+
# System prompt
|
|
65
|
+
print(ai.chat(
|
|
66
|
+
"Siapa kamu?",
|
|
67
|
+
model="deepseek-v4-pro",
|
|
68
|
+
system="Kamu adalah asisten AI yang ramah dan helpful."
|
|
69
|
+
))
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Model Tersedia
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
# Lihat semua model
|
|
76
|
+
print(ai.model_names())
|
|
77
|
+
# ['gpt-4o', 'gpt-4o-mini', 'claude-sonnet-4-6', 'gemini-2.5-pro', ...]
|
|
78
|
+
|
|
79
|
+
# Cek model tertentu
|
|
80
|
+
models = ai.list_models()
|
|
81
|
+
for m in models:
|
|
82
|
+
print(m.id, m.owned_by)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Async
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
import asyncio
|
|
89
|
+
from aksesai import AksesAI
|
|
90
|
+
|
|
91
|
+
async def main():
|
|
92
|
+
ai = AksesAI("sk-xxxx")
|
|
93
|
+
response = await ai.chat_async("Halo dari async!")
|
|
94
|
+
print(response)
|
|
95
|
+
|
|
96
|
+
asyncio.run(main())
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Embeddings
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
vector = ai.embed("AksesAI adalah platform AI Indonesia")
|
|
103
|
+
print(len(vector)) # 1536
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Test Koneksi
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
ai = AksesAI("sk-xxxx")
|
|
110
|
+
if ai.test():
|
|
111
|
+
print("🚀 Koneksi berhasil!")
|
|
112
|
+
else:
|
|
113
|
+
print("❌ Gagal — cek API key di https://aksesai.id/dashboard")
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Environment Variable
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
export AKSESAI_API_KEY="sk-xxxx"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```python
|
|
125
|
+
ai = AksesAI() # Auto baca dari env
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 🔗 Links
|
|
131
|
+
|
|
132
|
+
- 🌐 [AksesAI Dashboard](https://aksesai.id)
|
|
133
|
+
- 📖 [Dokumentasi API](https://aksesai.id/#docs)
|
|
134
|
+
- 💬 [Support Telegram](https://t.me/aksesai)
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
**Dibuat di Indonesia ❤️🇮🇩**
|
aksesai-0.1.0/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# AksesAI Python SDK
|
|
2
|
+
|
|
3
|
+
**Satu baris, langsung akses 35+ model AI.**
|
|
4
|
+
GPT, Claude, Gemini, DeepSeek — semua dalam Rupiah, tanpa kartu kredit.
|
|
5
|
+
|
|
6
|
+
[](https://pypi.org/project/aksesai/)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pip install aksesai
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
from aksesai import AksesAI
|
|
21
|
+
|
|
22
|
+
# Dapetin API key: https://aksesai.id/dashboard
|
|
23
|
+
ai = AksesAI("sk-xxxx")
|
|
24
|
+
|
|
25
|
+
# Chat biasa
|
|
26
|
+
print(ai.chat("Jelaskan AI dalam satu kalimat"))
|
|
27
|
+
|
|
28
|
+
# Pilih model
|
|
29
|
+
print(ai.chat("Buat puisi tentang Indonesia", model="claude-sonnet-4-6"))
|
|
30
|
+
|
|
31
|
+
# Streaming (kata per kata)
|
|
32
|
+
for chunk in ai.chat_stream("Ceritakan sejarah Jakarta"):
|
|
33
|
+
print(chunk, end="")
|
|
34
|
+
|
|
35
|
+
# System prompt
|
|
36
|
+
print(ai.chat(
|
|
37
|
+
"Siapa kamu?",
|
|
38
|
+
model="deepseek-v4-pro",
|
|
39
|
+
system="Kamu adalah asisten AI yang ramah dan helpful."
|
|
40
|
+
))
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Model Tersedia
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
# Lihat semua model
|
|
47
|
+
print(ai.model_names())
|
|
48
|
+
# ['gpt-4o', 'gpt-4o-mini', 'claude-sonnet-4-6', 'gemini-2.5-pro', ...]
|
|
49
|
+
|
|
50
|
+
# Cek model tertentu
|
|
51
|
+
models = ai.list_models()
|
|
52
|
+
for m in models:
|
|
53
|
+
print(m.id, m.owned_by)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Async
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
import asyncio
|
|
60
|
+
from aksesai import AksesAI
|
|
61
|
+
|
|
62
|
+
async def main():
|
|
63
|
+
ai = AksesAI("sk-xxxx")
|
|
64
|
+
response = await ai.chat_async("Halo dari async!")
|
|
65
|
+
print(response)
|
|
66
|
+
|
|
67
|
+
asyncio.run(main())
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Embeddings
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
vector = ai.embed("AksesAI adalah platform AI Indonesia")
|
|
74
|
+
print(len(vector)) # 1536
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Test Koneksi
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
ai = AksesAI("sk-xxxx")
|
|
81
|
+
if ai.test():
|
|
82
|
+
print("🚀 Koneksi berhasil!")
|
|
83
|
+
else:
|
|
84
|
+
print("❌ Gagal — cek API key di https://aksesai.id/dashboard")
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Environment Variable
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
export AKSESAI_API_KEY="sk-xxxx"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
ai = AksesAI() # Auto baca dari env
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 🔗 Links
|
|
102
|
+
|
|
103
|
+
- 🌐 [AksesAI Dashboard](https://aksesai.id)
|
|
104
|
+
- 📖 [Dokumentasi API](https://aksesai.id/#docs)
|
|
105
|
+
- 💬 [Support Telegram](https://t.me/aksesai)
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
**Dibuat di Indonesia ❤️🇮🇩**
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AksesAI Python SDK — AI API Gateway Indonesia.
|
|
3
|
+
|
|
4
|
+
35+ model AI premium: GPT, Claude, Gemini, DeepSeek, dan lainnya.
|
|
5
|
+
Bayar QRIS, tanpa kartu kredit. Satu baris, langsung jalan.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
from aksesai import AksesAI
|
|
9
|
+
|
|
10
|
+
ai = AksesAI("sk-xxxx")
|
|
11
|
+
response = ai.chat("Halo!", model="gpt-4o-mini")
|
|
12
|
+
print(response)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import warnings
|
|
17
|
+
from typing import Optional, List, Dict, Any, Iterator, overload
|
|
18
|
+
|
|
19
|
+
from openai import OpenAI, AsyncOpenAI
|
|
20
|
+
from openai.types.chat import ChatCompletion, ChatCompletionChunk
|
|
21
|
+
from openai.types.model import Model
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AksesAI:
|
|
25
|
+
"""
|
|
26
|
+
Client SDK untuk AksesAI API Gateway.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
api_key: API key dari dashboard AksesAI (https://aksesai.id/dashboard).
|
|
30
|
+
Default membaca dari environment variable ``AKSESAI_API_KEY``.
|
|
31
|
+
base_url: Base URL API AksesAI. Default ``https://api.aksesai.id/v1``.
|
|
32
|
+
**kwargs: Argumen tambahan diteruskan ke OpenAI client.
|
|
33
|
+
|
|
34
|
+
Example:
|
|
35
|
+
>>> ai = AksesAI("sk-xxxx")
|
|
36
|
+
>>> ai.chat("Jelaskan AI dalam satu kalimat")
|
|
37
|
+
'AI adalah teknologi yang memungkinkan komputer...'
|
|
38
|
+
|
|
39
|
+
>>> # Streaming
|
|
40
|
+
>>> for chunk in ai.chat_stream("Ceritakan tentang Indonesia"):
|
|
41
|
+
... print(chunk, end="")
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
DEFAULT_BASE_URL = "https://api.aksesai.id/v1"
|
|
45
|
+
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
api_key: Optional[str] = None,
|
|
49
|
+
base_url: Optional[str] = None,
|
|
50
|
+
**kwargs,
|
|
51
|
+
):
|
|
52
|
+
api_key = api_key or os.environ.get("AKSESAI_API_KEY")
|
|
53
|
+
if not api_key:
|
|
54
|
+
raise ValueError(
|
|
55
|
+
"API key diperlukan. Dapatkan di https://aksesai.id/dashboard dan "
|
|
56
|
+
"passing sebagai `AksesAI('sk-xxxx')` atau set env `AKSESAI_API_KEY`."
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
base_url = base_url or os.environ.get("AKSESAI_BASE_URL", self.DEFAULT_BASE_URL)
|
|
60
|
+
|
|
61
|
+
self._client = OpenAI(
|
|
62
|
+
api_key=api_key,
|
|
63
|
+
base_url=base_url,
|
|
64
|
+
**kwargs,
|
|
65
|
+
)
|
|
66
|
+
self._async_client: Optional[AsyncOpenAI] = None
|
|
67
|
+
self.api_key = api_key
|
|
68
|
+
self.base_url = base_url
|
|
69
|
+
|
|
70
|
+
# ─── Chat ────────────────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
def chat(
|
|
73
|
+
self,
|
|
74
|
+
message: str,
|
|
75
|
+
*,
|
|
76
|
+
model: str = "gpt-4o-mini",
|
|
77
|
+
system: Optional[str] = None,
|
|
78
|
+
temperature: float = 0.7,
|
|
79
|
+
max_tokens: int = 1024,
|
|
80
|
+
**kwargs,
|
|
81
|
+
) -> str:
|
|
82
|
+
"""
|
|
83
|
+
Kirim pesan dan dapatkan respons teks.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
message: Pesan user.
|
|
87
|
+
model: Nama model (default ``gpt-4o-mini``).
|
|
88
|
+
Cek daftar lengkap: https://aksesai.id/#models
|
|
89
|
+
system: System prompt opsional.
|
|
90
|
+
temperature: Kreativitas respons (0.0–2.0).
|
|
91
|
+
max_tokens: Maksimum token output.
|
|
92
|
+
**kwargs: Parameter tambahan diteruskan ke API.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
Teks respons dari model.
|
|
96
|
+
"""
|
|
97
|
+
messages = []
|
|
98
|
+
if system:
|
|
99
|
+
messages.append({"role": "system", "content": system})
|
|
100
|
+
messages.append({"role": "user", "content": message})
|
|
101
|
+
|
|
102
|
+
response = self._client.chat.completions.create(
|
|
103
|
+
model=model,
|
|
104
|
+
messages=messages,
|
|
105
|
+
temperature=temperature,
|
|
106
|
+
max_tokens=max_tokens,
|
|
107
|
+
**kwargs,
|
|
108
|
+
)
|
|
109
|
+
return response.choices[0].message.content or ""
|
|
110
|
+
|
|
111
|
+
def chat_stream(
|
|
112
|
+
self,
|
|
113
|
+
message: str,
|
|
114
|
+
*,
|
|
115
|
+
model: str = "gpt-4o-mini",
|
|
116
|
+
system: Optional[str] = None,
|
|
117
|
+
temperature: float = 0.7,
|
|
118
|
+
max_tokens: int = 1024,
|
|
119
|
+
**kwargs,
|
|
120
|
+
) -> Iterator[str]:
|
|
121
|
+
"""
|
|
122
|
+
Kirim pesan dan dapatkan respons streaming (kata per kata).
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
message: Pesan user.
|
|
126
|
+
model: Nama model.
|
|
127
|
+
system: System prompt opsional.
|
|
128
|
+
temperature: Kreativitas respons.
|
|
129
|
+
max_tokens: Maksimum token output.
|
|
130
|
+
**kwargs: Parameter tambahan.
|
|
131
|
+
|
|
132
|
+
Yields:
|
|
133
|
+
Potongan teks dari model (satu per satu).
|
|
134
|
+
"""
|
|
135
|
+
messages = []
|
|
136
|
+
if system:
|
|
137
|
+
messages.append({"role": "system", "content": system})
|
|
138
|
+
messages.append({"role": "user", "content": message})
|
|
139
|
+
|
|
140
|
+
stream = self._client.chat.completions.create(
|
|
141
|
+
model=model,
|
|
142
|
+
messages=messages,
|
|
143
|
+
temperature=temperature,
|
|
144
|
+
max_tokens=max_tokens,
|
|
145
|
+
stream=True,
|
|
146
|
+
**kwargs,
|
|
147
|
+
)
|
|
148
|
+
for chunk in stream:
|
|
149
|
+
delta = chunk.choices[0].delta
|
|
150
|
+
if delta.content:
|
|
151
|
+
yield delta.content
|
|
152
|
+
|
|
153
|
+
def chat_raw(
|
|
154
|
+
self,
|
|
155
|
+
messages: List[Dict[str, str]],
|
|
156
|
+
*,
|
|
157
|
+
model: str = "gpt-4o-mini",
|
|
158
|
+
**kwargs,
|
|
159
|
+
) -> ChatCompletion:
|
|
160
|
+
"""
|
|
161
|
+
Kirim messages mentah (format OpenAI) dan dapatkan response object penuh.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
messages: List messages dalam format [{"role": "...", "content": "..."}].
|
|
165
|
+
model: Nama model.
|
|
166
|
+
**kwargs: Parameter tambahan.
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
ChatCompletion object dari OpenAI SDK.
|
|
170
|
+
"""
|
|
171
|
+
return self._client.chat.completions.create(
|
|
172
|
+
model=model,
|
|
173
|
+
messages=messages,
|
|
174
|
+
**kwargs,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# ─── Models ──────────────────────────────────────────────────
|
|
178
|
+
|
|
179
|
+
def list_models(self) -> List[Model]:
|
|
180
|
+
"""
|
|
181
|
+
Ambil daftar model yang tersedia di AksesAI.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
List of Model objects.
|
|
185
|
+
"""
|
|
186
|
+
return self._client.models.list().data
|
|
187
|
+
|
|
188
|
+
def model_names(self) -> List[str]:
|
|
189
|
+
"""
|
|
190
|
+
Ambil daftar nama model yang tersedia.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
List nama model (string).
|
|
194
|
+
"""
|
|
195
|
+
models = self.list_models()
|
|
196
|
+
return [m.id for m in models]
|
|
197
|
+
|
|
198
|
+
# ─── Async ───────────────────────────────────────────────────
|
|
199
|
+
|
|
200
|
+
@property
|
|
201
|
+
def async_client(self) -> AsyncOpenAI:
|
|
202
|
+
"""Async client (lazy init)."""
|
|
203
|
+
if self._async_client is None:
|
|
204
|
+
self._async_client = AsyncOpenAI(
|
|
205
|
+
api_key=self.api_key,
|
|
206
|
+
base_url=self.base_url,
|
|
207
|
+
)
|
|
208
|
+
return self._async_client
|
|
209
|
+
|
|
210
|
+
async def chat_async(
|
|
211
|
+
self,
|
|
212
|
+
message: str,
|
|
213
|
+
*,
|
|
214
|
+
model: str = "gpt-4o-mini",
|
|
215
|
+
system: Optional[str] = None,
|
|
216
|
+
temperature: float = 0.7,
|
|
217
|
+
max_tokens: int = 1024,
|
|
218
|
+
**kwargs,
|
|
219
|
+
) -> str:
|
|
220
|
+
"""Async version of :meth:`chat`."""
|
|
221
|
+
messages = []
|
|
222
|
+
if system:
|
|
223
|
+
messages.append({"role": "system", "content": system})
|
|
224
|
+
messages.append({"role": "user", "content": message})
|
|
225
|
+
|
|
226
|
+
response = await self.async_client.chat.completions.create(
|
|
227
|
+
model=model,
|
|
228
|
+
messages=messages,
|
|
229
|
+
temperature=temperature,
|
|
230
|
+
max_tokens=max_tokens,
|
|
231
|
+
**kwargs,
|
|
232
|
+
)
|
|
233
|
+
return response.choices[0].message.content or ""
|
|
234
|
+
|
|
235
|
+
# ─── Embeddings ──────────────────────────────────────────────
|
|
236
|
+
|
|
237
|
+
def embed(
|
|
238
|
+
self,
|
|
239
|
+
text: str,
|
|
240
|
+
*,
|
|
241
|
+
model: str = "text-embedding-3-small",
|
|
242
|
+
**kwargs,
|
|
243
|
+
) -> List[float]:
|
|
244
|
+
"""
|
|
245
|
+
Generate embedding vector dari text.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
text: Teks yang akan di-embed.
|
|
249
|
+
model: Model embedding.
|
|
250
|
+
**kwargs: Parameter tambahan.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
List float embedding vector.
|
|
254
|
+
"""
|
|
255
|
+
response = self._client.embeddings.create(
|
|
256
|
+
model=model,
|
|
257
|
+
input=text,
|
|
258
|
+
**kwargs,
|
|
259
|
+
)
|
|
260
|
+
return response.data[0].embedding
|
|
261
|
+
|
|
262
|
+
# ─── Utils ───────────────────────────────────────────────────
|
|
263
|
+
|
|
264
|
+
def test(self) -> bool:
|
|
265
|
+
"""
|
|
266
|
+
Test koneksi — kirim ping ke API AksesAI.
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
True jika koneksi berhasil.
|
|
270
|
+
"""
|
|
271
|
+
try:
|
|
272
|
+
models = self.list_models()
|
|
273
|
+
return len(models) > 0
|
|
274
|
+
except Exception:
|
|
275
|
+
return False
|
|
276
|
+
|
|
277
|
+
def __repr__(self) -> str:
|
|
278
|
+
try:
|
|
279
|
+
count = len(self.list_models())
|
|
280
|
+
except Exception:
|
|
281
|
+
count = "?"
|
|
282
|
+
return f"AksesAI(base_url='{self.base_url}', models={count})"
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aksesai
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python SDK untuk AksesAI — AI API Gateway Indonesia. 35+ model AI, bayar QRIS, tanpa kartu kredit.
|
|
5
|
+
Author-email: AksesAI <support@aksesai.id>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://aksesai.id
|
|
8
|
+
Project-URL: Documentation, https://aksesai.id/#docs
|
|
9
|
+
Project-URL: Repository, https://github.com/aksesai/aksesai-python
|
|
10
|
+
Project-URL: Dashboard, https://aksesai.id/dashboard
|
|
11
|
+
Keywords: ai,openai,llm,indonesia,chatgpt,claude,gemini,deepseek
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: openai>=1.0.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest; extra == "dev"
|
|
26
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
27
|
+
Requires-Dist: black; extra == "dev"
|
|
28
|
+
Requires-Dist: ruff; extra == "dev"
|
|
29
|
+
|
|
30
|
+
# AksesAI Python SDK
|
|
31
|
+
|
|
32
|
+
**Satu baris, langsung akses 35+ model AI.**
|
|
33
|
+
GPT, Claude, Gemini, DeepSeek — semua dalam Rupiah, tanpa kartu kredit.
|
|
34
|
+
|
|
35
|
+
[](https://pypi.org/project/aksesai/)
|
|
36
|
+
[](LICENSE)
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install aksesai
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Quick Start
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
from aksesai import AksesAI
|
|
50
|
+
|
|
51
|
+
# Dapetin API key: https://aksesai.id/dashboard
|
|
52
|
+
ai = AksesAI("sk-xxxx")
|
|
53
|
+
|
|
54
|
+
# Chat biasa
|
|
55
|
+
print(ai.chat("Jelaskan AI dalam satu kalimat"))
|
|
56
|
+
|
|
57
|
+
# Pilih model
|
|
58
|
+
print(ai.chat("Buat puisi tentang Indonesia", model="claude-sonnet-4-6"))
|
|
59
|
+
|
|
60
|
+
# Streaming (kata per kata)
|
|
61
|
+
for chunk in ai.chat_stream("Ceritakan sejarah Jakarta"):
|
|
62
|
+
print(chunk, end="")
|
|
63
|
+
|
|
64
|
+
# System prompt
|
|
65
|
+
print(ai.chat(
|
|
66
|
+
"Siapa kamu?",
|
|
67
|
+
model="deepseek-v4-pro",
|
|
68
|
+
system="Kamu adalah asisten AI yang ramah dan helpful."
|
|
69
|
+
))
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Model Tersedia
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
# Lihat semua model
|
|
76
|
+
print(ai.model_names())
|
|
77
|
+
# ['gpt-4o', 'gpt-4o-mini', 'claude-sonnet-4-6', 'gemini-2.5-pro', ...]
|
|
78
|
+
|
|
79
|
+
# Cek model tertentu
|
|
80
|
+
models = ai.list_models()
|
|
81
|
+
for m in models:
|
|
82
|
+
print(m.id, m.owned_by)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Async
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
import asyncio
|
|
89
|
+
from aksesai import AksesAI
|
|
90
|
+
|
|
91
|
+
async def main():
|
|
92
|
+
ai = AksesAI("sk-xxxx")
|
|
93
|
+
response = await ai.chat_async("Halo dari async!")
|
|
94
|
+
print(response)
|
|
95
|
+
|
|
96
|
+
asyncio.run(main())
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Embeddings
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
vector = ai.embed("AksesAI adalah platform AI Indonesia")
|
|
103
|
+
print(len(vector)) # 1536
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Test Koneksi
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
ai = AksesAI("sk-xxxx")
|
|
110
|
+
if ai.test():
|
|
111
|
+
print("🚀 Koneksi berhasil!")
|
|
112
|
+
else:
|
|
113
|
+
print("❌ Gagal — cek API key di https://aksesai.id/dashboard")
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Environment Variable
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
export AKSESAI_API_KEY="sk-xxxx"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```python
|
|
125
|
+
ai = AksesAI() # Auto baca dari env
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 🔗 Links
|
|
131
|
+
|
|
132
|
+
- 🌐 [AksesAI Dashboard](https://aksesai.id)
|
|
133
|
+
- 📖 [Dokumentasi API](https://aksesai.id/#docs)
|
|
134
|
+
- 💬 [Support Telegram](https://t.me/aksesai)
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
**Dibuat di Indonesia ❤️🇮🇩**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "aksesai"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Python SDK untuk AksesAI — AI API Gateway Indonesia. 35+ model AI, bayar QRIS, tanpa kartu kredit."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
authors = [
|
|
12
|
+
{name = "AksesAI", email = "support@aksesai.id"}
|
|
13
|
+
]
|
|
14
|
+
keywords = ["ai", "openai", "llm", "indonesia", "chatgpt", "claude", "gemini", "deepseek"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 4 - Beta",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"License :: OSI Approved :: MIT License",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3.9",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
25
|
+
]
|
|
26
|
+
requires-python = ">=3.9"
|
|
27
|
+
dependencies = [
|
|
28
|
+
"openai>=1.0.0",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[project.optional-dependencies]
|
|
32
|
+
dev = ["pytest", "pytest-asyncio", "black", "ruff"]
|
|
33
|
+
|
|
34
|
+
[project.urls]
|
|
35
|
+
Homepage = "https://aksesai.id"
|
|
36
|
+
Documentation = "https://aksesai.id/#docs"
|
|
37
|
+
Repository = "https://github.com/aksesai/aksesai-python"
|
|
38
|
+
Dashboard = "https://aksesai.id/dashboard"
|
|
39
|
+
|
|
40
|
+
[tool.setuptools.packages.find]
|
|
41
|
+
where = ["."]
|
aksesai-0.1.0/setup.cfg
ADDED