mira-network 0.1.2__py3-none-any.whl → 0.1.4__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.
@@ -1,12 +1,10 @@
1
1
  from .client import MiraClient
2
+ from .sync_client import MiraSyncClient
2
3
  from .models import (
3
4
  Message,
4
5
  ModelProvider,
5
6
  AiRequest,
6
- FlowChatCompletion,
7
- FlowRequest,
8
7
  ApiTokenRequest,
9
- AddCreditRequest,
10
8
  )
11
9
 
12
10
  __all__ = [
@@ -14,8 +12,5 @@ __all__ = [
14
12
  "Message",
15
13
  "ModelProvider",
16
14
  "AiRequest",
17
- "FlowChatCompletion",
18
- "FlowRequest",
19
15
  "ApiTokenRequest",
20
- "AddCreditRequest",
21
16
  ]
mira_network/client.py ADDED
@@ -0,0 +1,173 @@
1
+ from typing import AsyncIterator, Optional, List, Dict, AsyncGenerator, Union
2
+ import httpx
3
+ from .models import (
4
+ AiRequest,
5
+ ApiTokenRequest,
6
+ )
7
+
8
+
9
+ class MiraClient:
10
+
11
+ def __init__(
12
+ self,
13
+ base_url: str = "https://apis.mira.network/",
14
+ api_token: Optional[str] = None,
15
+ ):
16
+ """Initialize Mira client.
17
+
18
+ Args:
19
+ base_url: Base URL of the Mira API
20
+ api_token: Optional API token for authentication
21
+ """
22
+ self.base_url = base_url
23
+ self.api_token = api_token
24
+ self._client = httpx.AsyncClient()
25
+
26
+ async def __aenter__(self):
27
+ return self
28
+
29
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
30
+ await self._client.aclose()
31
+
32
+ def _get_headers(self) -> Dict[str, str]:
33
+ headers = {"Content-Type": "application/json"}
34
+ if self.api_token:
35
+ headers["Authorization"] = f"Bearer {self.api_token}"
36
+ return headers
37
+
38
+ async def list_models(self) -> List[str]:
39
+ """List available models."""
40
+ response = await self._client.get(
41
+ f"{self.base_url}/v1/models",
42
+ headers=self._get_headers(),
43
+ )
44
+ response.raise_for_status()
45
+ return response.json()
46
+
47
+ async def generate(self, request: AiRequest) -> Union[str, AsyncIterator[str]]:
48
+ """Generate text using the specified model."""
49
+ response = await self._client.post(
50
+ f"{self.base_url}/v1/chat/completions",
51
+ headers=self._get_headers(),
52
+ json=request.model_dump(),
53
+ )
54
+
55
+ response.raise_for_status()
56
+
57
+ if request.stream:
58
+ return response.aiter_lines()
59
+ else:
60
+ return response.json()
61
+
62
+ # async def generate_with_flow(
63
+ # self, flow_id: str, request: FlowChatCompletion
64
+ # ) -> Union[str, AsyncGenerator[str, None]]:
65
+ # """Generate text using a specific flow."""
66
+ # response = await self._client.post(
67
+ # f"{self.base_url}/v1/flows/{flow_id}/chat/completions",
68
+ # headers=self._get_headers(),
69
+ # json=request.model_dump(),
70
+ # )
71
+ # response.raise_for_status()
72
+ # return response.json()
73
+
74
+ # async def list_flows(self) -> List[Dict]:
75
+ # """List all flows."""
76
+ # response = await self._client.get(
77
+ # f"{self.base_url}/flows",
78
+ # headers=self._get_headers(),
79
+ # )
80
+ # response.raise_for_status()
81
+ # return response.json()
82
+
83
+ # async def get_flow(self, flow_id: str) -> Dict:
84
+ # """Get details of a specific flow."""
85
+ # response = await self._client.get(
86
+ # f"{self.base_url}/flows/{flow_id}",
87
+ # headers=self._get_headers(),
88
+ # )
89
+ # response.raise_for_status()
90
+ # return response.json()
91
+
92
+ # async def create_flow(self, request: FlowRequest) -> Dict:
93
+ # """Create a new flow."""
94
+ # response = await self._client.post(
95
+ # f"{self.base_url}/flows",
96
+ # headers=self._get_headers(),
97
+ # json=request.model_dump(),
98
+ # )
99
+ # response.raise_for_status()
100
+ # return response.json()
101
+
102
+ # async def update_flow(self, flow_id: str, request: FlowRequest) -> Dict:
103
+ # """Update an existing flow."""
104
+ # response = await self._client.put(
105
+ # f"{self.base_url}/flows/{flow_id}",
106
+ # headers=self._get_headers(),
107
+ # json=request.model_dump(),
108
+ # )
109
+ # response.raise_for_status()
110
+ # return response.json()
111
+
112
+ # async def delete_flow(self, flow_id: str) -> None:
113
+ # """Delete a flow."""
114
+ # response = await self._client.delete(
115
+ # f"{self.base_url}/flows/{flow_id}",
116
+ # headers=self._get_headers(),
117
+ # )
118
+ # response.raise_for_status()
119
+
120
+ async def create_api_token(self, request: ApiTokenRequest) -> Dict:
121
+ """Create a new API token."""
122
+ response = await self._client.post(
123
+ f"{self.base_url}/api-tokens",
124
+ headers=self._get_headers(),
125
+ json=request.model_dump(),
126
+ )
127
+ response.raise_for_status()
128
+ return response.json()
129
+
130
+ async def list_api_tokens(self) -> List[Dict]:
131
+ """List all API tokens."""
132
+ response = await self._client.get(
133
+ f"{self.base_url}/api-tokens",
134
+ headers=self._get_headers(),
135
+ )
136
+ response.raise_for_status()
137
+ return response.json()
138
+
139
+ async def delete_api_token(self, token: str) -> None:
140
+ """Delete an API token."""
141
+ response = await self._client.delete(
142
+ f"{self.base_url}/api-tokens/{token}",
143
+ headers=self._get_headers(),
144
+ )
145
+ response.raise_for_status()
146
+
147
+ async def get_user_credits(self) -> Dict:
148
+ """Get user credits information."""
149
+ response = await self._client.get(
150
+ f"{self.base_url}/user-credits",
151
+ headers=self._get_headers(),
152
+ )
153
+ response.raise_for_status()
154
+ return response.json()
155
+
156
+ # async def add_credit(self, request: AddCreditRequest) -> Dict:
157
+ # """Add credits to a user account."""
158
+ # response = await self._client.post(
159
+ # f"{self.base_url}/credits",
160
+ # headers=self._get_headers(),
161
+ # json=request.model_dump(),
162
+ # )
163
+ # response.raise_for_status()
164
+ # return response.json()
165
+
166
+ async def get_credits_history(self) -> List[Dict]:
167
+ """Get user credits history."""
168
+ response = await self._client.get(
169
+ f"{self.base_url}/user-credits-history",
170
+ headers=self._get_headers(),
171
+ )
172
+ response.raise_for_status()
173
+ return response.json()
@@ -22,7 +22,9 @@ class ModelProvider(BaseModel):
22
22
 
23
23
  class AiRequest(BaseModel):
24
24
  model: str = Field("mira/llama3.1", title="Model")
25
- model_provider: Optional[ModelProvider] = Field(None, title="Model Provider (optional)")
25
+ model_provider: Optional[ModelProvider] = Field(
26
+ None, title="Model Provider (optional)"
27
+ )
26
28
  messages: List[Message] = Field([], title="Messages")
27
29
  stream: Optional[bool] = Field(False, title="Stream")
28
30
 
@@ -34,34 +36,34 @@ class AiRequest(BaseModel):
34
36
  return v
35
37
 
36
38
 
37
- class FlowChatCompletion(BaseModel):
38
- variables: Optional[Dict] = Field(None, title="Variables")
39
+ # class FlowChatCompletion(BaseModel):
40
+ # variables: Optional[Dict] = Field(None, title="Variables")
39
41
 
40
42
 
41
- class FlowRequest(BaseModel):
42
- system_prompt: str
43
- name: str
43
+ # class FlowRequest(BaseModel):
44
+ # system_prompt: str
45
+ # name: str
44
46
 
45
47
 
46
48
  class ApiTokenRequest(BaseModel):
47
49
  description: Optional[str] = None
48
50
 
49
51
 
50
- class AddCreditRequest(BaseModel):
51
- user_id: str
52
- amount: float
53
- description: Optional[str] = None
54
-
55
- @field_validator("amount")
56
- @classmethod
57
- def validate_amount(cls, v: float) -> float:
58
- if v <= 0:
59
- raise ValueError("Amount must be greater than 0")
60
- return v
61
-
62
- @field_validator("user_id")
63
- @classmethod
64
- def validate_user_id(cls, v: str) -> str:
65
- if not v.strip():
66
- raise ValueError("User ID cannot be empty")
67
- return v
52
+ # class AddCreditRequest(BaseModel):
53
+ # user_id: str
54
+ # amount: float
55
+ # description: Optional[str] = None
56
+
57
+ # @field_validator("amount")
58
+ # @classmethod
59
+ # def validate_amount(cls, v: float) -> float:
60
+ # if v <= 0:
61
+ # raise ValueError("Amount must be greater than 0")
62
+ # return v
63
+
64
+ # @field_validator("user_id")
65
+ # @classmethod
66
+ # def validate_user_id(cls, v: str) -> str:
67
+ # if not v.strip():
68
+ # raise ValueError("User ID cannot be empty")
69
+ # return v
@@ -0,0 +1,111 @@
1
+ from typing import Optional, List, Dict, Iterator, Union
2
+ import requests
3
+ from .models import (
4
+ AiRequest,
5
+ ApiTokenRequest,
6
+ )
7
+
8
+
9
+ class MiraSyncClient:
10
+ def __init__(
11
+ self,
12
+ base_url: str = "https://apis.mira.network/",
13
+ api_token: Optional[str] = None,
14
+ ):
15
+ """Initialize Mira synchronous client.
16
+
17
+ Args:
18
+ base_url: Base URL of the Mira API
19
+ api_token: Optional API token for authentication
20
+ """
21
+ self.base_url = base_url
22
+ self.api_token = api_token
23
+ self._session = requests.Session()
24
+
25
+ def __enter__(self):
26
+ return self
27
+
28
+ def __exit__(self, exc_type, exc_val, exc_tb):
29
+ self._session.close()
30
+
31
+ def _get_headers(self) -> Dict[str, str]:
32
+ headers = {"Content-Type": "application/json"}
33
+ if self.api_token:
34
+ headers["Authorization"] = f"Bearer {self.api_token}"
35
+ return headers
36
+
37
+ def list_models(self) -> List[str]:
38
+ """List available models."""
39
+ response = self._session.get(
40
+ f"{self.base_url}/v1/models",
41
+ headers=self._get_headers(),
42
+ )
43
+ response.raise_for_status()
44
+ return response.json()
45
+
46
+ def generate(self, request: AiRequest) -> Union[str, Iterator[str]]:
47
+ """Generate text using the specified model.
48
+
49
+ Args:
50
+ request: The AI request configuration
51
+
52
+ Returns:
53
+ Either a string response (when stream=False) or an iterator of string chunks (when stream=True)
54
+ """
55
+ response = self._session.post(
56
+ f"{self.base_url}/v1/chat/completions",
57
+ headers=self._get_headers(),
58
+ json=request.model_dump(),
59
+ stream=request.stream,
60
+ )
61
+ response.raise_for_status()
62
+
63
+ if request.stream:
64
+ return response.iter_lines(decode_unicode=True)
65
+ else:
66
+ return response.json()
67
+
68
+ def create_api_token(self, request: ApiTokenRequest) -> Dict:
69
+ """Create a new API token."""
70
+ response = self._session.post(
71
+ f"{self.base_url}/api-tokens",
72
+ headers=self._get_headers(),
73
+ json=request.model_dump(),
74
+ )
75
+ response.raise_for_status()
76
+ return response.json()
77
+
78
+ def list_api_tokens(self) -> List[Dict]:
79
+ """List all API tokens."""
80
+ response = self._session.get(
81
+ f"{self.base_url}/api-tokens",
82
+ headers=self._get_headers(),
83
+ )
84
+ response.raise_for_status()
85
+ return response.json()
86
+
87
+ def delete_api_token(self, token: str) -> None:
88
+ """Delete an API token."""
89
+ response = self._session.delete(
90
+ f"{self.base_url}/api-tokens/{token}",
91
+ headers=self._get_headers(),
92
+ )
93
+ response.raise_for_status()
94
+
95
+ def get_user_credits(self) -> Dict:
96
+ """Get user credits information."""
97
+ response = self._session.get(
98
+ f"{self.base_url}/user-credits",
99
+ headers=self._get_headers(),
100
+ )
101
+ response.raise_for_status()
102
+ return response.json()
103
+
104
+ def get_credits_history(self) -> List[Dict]:
105
+ """Get user credits history."""
106
+ response = self._session.get(
107
+ f"{self.base_url}/user-credits-history",
108
+ headers=self._get_headers(),
109
+ )
110
+ response.raise_for_status()
111
+ return response.json()
@@ -0,0 +1,178 @@
1
+ Metadata-Version: 2.1
2
+ Name: mira-network
3
+ Version: 0.1.4
4
+ Summary: Python SDK for Mira Network API
5
+ Author-Email: sarim2000 <sarimbleedblue@gmail.com>
6
+ License: MIT
7
+ Requires-Python: ==3.10.*
8
+ Requires-Dist: httpx>=0.28.1
9
+ Requires-Dist: pydantic>=2.10.4
10
+ Requires-Dist: typing-extensions>=4.8.0
11
+ Requires-Dist: requests>=2.32.3
12
+ Requires-Dist: pytest-cov>=6.0.0
13
+ Description-Content-Type: text/markdown
14
+
15
+ # Mira Network SDK
16
+
17
+ A Python SDK for interacting with the Mira Network API. This SDK provides both synchronous and asynchronous interfaces to access Mira API endpoints for model inference, API token management, and credit system operations.
18
+
19
+ ## Installation
20
+
21
+ ```bash
22
+ pip install mira-network
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ ### Synchronous Usage
28
+
29
+ ```python
30
+ from mira_network.sync_client import MiraSyncClient
31
+ from mira_network.models import AiRequest, Message
32
+
33
+ # Using context manager (recommended)
34
+ with MiraSyncClient(api_token="your-api-token") as client:
35
+ # Example 1: Non-streaming response
36
+ request = AiRequest(
37
+ messages=[
38
+ Message(role="system", content="You are a helpful assistant."),
39
+ Message(role="user", content="Hello!")
40
+ ],
41
+ stream=False
42
+ )
43
+ response = client.generate(request)
44
+ print(response)
45
+
46
+ # Example 2: Streaming response
47
+ stream_request = AiRequest(
48
+ messages=[
49
+ Message(role="system", content="You are a helpful assistant."),
50
+ Message(role="user", content="Tell me a story!")
51
+ ],
52
+ stream=True
53
+ )
54
+ for chunk in client.generate(stream_request):
55
+ print(chunk)
56
+ ```
57
+
58
+ ### Asynchronous Usage
59
+
60
+ ```python
61
+ import asyncio
62
+ from mira_network.client import MiraClient
63
+ from mira_network.models import AiRequest, Message
64
+
65
+ async def main():
66
+ # Using async context manager (recommended)
67
+ async with MiraClient(api_token="your-api-token") as client:
68
+ # Example 1: Non-streaming response
69
+ request = AiRequest(
70
+ messages=[
71
+ Message(role="system", content="You are a helpful assistant."),
72
+ Message(role="user", content="Hello!")
73
+ ],
74
+ stream=False
75
+ )
76
+ response = await client.generate(request)
77
+ print(response)
78
+
79
+ # Example 2: Streaming response
80
+ stream_request = AiRequest(
81
+ messages=[
82
+ Message(role="system", content="You are a helpful assistant."),
83
+ Message(role="user", content="Tell me a story!")
84
+ ],
85
+ stream=True
86
+ )
87
+ async for chunk in await client.generate(stream_request):
88
+ print(chunk)
89
+
90
+ if __name__ == "__main__":
91
+ asyncio.run(main())
92
+ ```
93
+
94
+ ## API Reference
95
+
96
+ ### Client Initialization
97
+
98
+ The SDK provides two client classes:
99
+ - `MiraSyncClient`: Synchronous client using `requests`
100
+ - `MiraClient`: Asynchronous client using `httpx`
101
+
102
+ Both clients support context managers for proper resource cleanup:
103
+
104
+ ```python
105
+ # Synchronous
106
+ with MiraSyncClient(api_token="your-api-token") as client:
107
+ # Your sync code here
108
+
109
+ # Asynchronous
110
+ async with MiraClient(api_token="your-api-token") as client:
111
+ # Your async code here
112
+ ```
113
+
114
+ ### Models
115
+
116
+ - `Message`: Represents a chat message
117
+ - `role`: String ("system", "user", or "assistant")
118
+ - `content`: String content of the message
119
+
120
+ - `AiRequest`: Configuration for model inference
121
+ - `model`: Model identifier (default: "mira/llama3.1")
122
+ - `messages`: List of Message objects
123
+ - `stream`: Boolean to enable streaming responses (default: False)
124
+ - `model_provider`: Optional ModelProvider configuration
125
+
126
+ - `ModelProvider`: Custom provider configuration
127
+ - `base_url`: Provider's base URL
128
+ - `api_key`: Provider's API key
129
+
130
+ - `ApiTokenRequest`: Request for creating API tokens
131
+ - `description`: Optional description for the token
132
+
133
+ ### Available Methods
134
+
135
+ Both sync and async clients provide the same methods with identical parameters. The only difference is that async methods must be awaited.
136
+
137
+ #### Model Operations
138
+ ```python
139
+ # Sync
140
+ models = client.list_models()
141
+ response = client.generate(AiRequest(messages=[...], stream=False))
142
+ for chunk in client.generate(AiRequest(messages=[...], stream=True)):
143
+ print(chunk)
144
+
145
+ # Async
146
+ models = await client.list_models()
147
+ response = await client.generate(AiRequest(messages=[...], stream=False))
148
+ async for chunk in await client.generate(AiRequest(messages=[...], stream=True)):
149
+ print(chunk)
150
+ ```
151
+
152
+ #### API Token Operations
153
+ ```python
154
+ # Sync
155
+ token = client.create_api_token(ApiTokenRequest(description="My Token"))
156
+ tokens = client.list_api_tokens()
157
+ client.delete_api_token("token-to-delete")
158
+
159
+ # Async
160
+ token = await client.create_api_token(ApiTokenRequest(description="My Token"))
161
+ tokens = await client.list_api_tokens()
162
+ await client.delete_api_token("token-to-delete")
163
+ ```
164
+
165
+ #### Credit Operations
166
+ ```python
167
+ # Sync
168
+ credits = client.get_user_credits()
169
+ history = client.get_credits_history()
170
+
171
+ # Async
172
+ credits = await client.get_user_credits()
173
+ history = await client.get_credits_history()
174
+ ```
175
+
176
+ ## License
177
+
178
+ MIT License
@@ -0,0 +1,8 @@
1
+ mira_network-0.1.4.dist-info/METADATA,sha256=l_M7hizI6V3qfd94wTFRb9tViHhN62_7Ze4QOGy6i_Y,5026
2
+ mira_network-0.1.4.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
+ mira_network-0.1.4.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
4
+ mira_network/__init__.py,sha256=82x6bhP9_ZhHaBkW-O10F4ADipp1crGQzTaxQ878buA,272
5
+ mira_network/client.py,sha256=_Fj4g20CSyzqHnDHhn43TunFLLub_n2Ix3cBAwa7spU,5739
6
+ mira_network/models.py,sha256=aEJiDHEDFIAQMB-C8ZFY5ruRNGJ-U2Cz9vS5nF7GqVg,1805
7
+ mira_network/sync_client.py,sha256=0f_oakroMp-OYC-WRvNRcWnQW9YtUdQRdVxKNeNbMUA,3400
8
+ mira_network-0.1.4.dist-info/RECORD,,
@@ -1,107 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: mira-network
3
- Version: 0.1.2
4
- Summary: Python SDK for Mira Network API
5
- Author-Email: sarim2000 <sarimbleedblue@gmail.com>
6
- License: MIT
7
- Requires-Python: ==3.10.*
8
- Requires-Dist: httpx>=0.28.1
9
- Requires-Dist: pydantic>=2.10.4
10
- Requires-Dist: typing-extensions>=4.8.0
11
- Requires-Dist: requests>=2.32.3
12
- Description-Content-Type: text/markdown
13
-
14
- # Mira Network SDK
15
-
16
- A Python SDK for interacting with the Mira Network API. This SDK provides a simple interface to access all Mira API endpoints including model inference, flow management, and credit system.
17
-
18
- ## Installation
19
-
20
- ```bash
21
- pip install mira-network
22
- ```
23
-
24
- ## Quick Start
25
-
26
- ```python
27
- import asyncio
28
- from mira_sdk import MiraClient, Message, AiRequest
29
-
30
- async def main():
31
- # Initialize client
32
- client = MiraClient(
33
- base_url="https://api.mira.example.com",
34
- api_token="your-api-token"
35
- )
36
-
37
- # List available models
38
- models = await client.list_models()
39
- print("Available models:", models)
40
-
41
- # Generate text
42
- request = AiRequest(
43
- model="mira/llama3.1",
44
- messages=[
45
- Message(role="system", content="You are a helpful assistant."),
46
- Message(role="user", content="Hello!")
47
- ],
48
- model_provider=None
49
- )
50
-
51
- response = await client.generate(request)
52
- print("Response:", response)
53
-
54
- if __name__ == "__main__":
55
- asyncio.run(main())
56
- ```
57
-
58
- ## Features
59
-
60
- - Asynchronous API using `httpx`
61
- - Full type hints support
62
- - Pydantic models for request/response validation
63
- - Support for all Mira API endpoints:
64
- - Model inference
65
- - Flow management
66
- - API token management
67
- - Credit system
68
-
69
- ## API Reference
70
-
71
- ### Models
72
-
73
- - `Message`: Represents a chat message
74
- - `ModelProvider`: Configuration for custom model providers
75
- - `AiRequest`: Request for model inference
76
- - `FlowChatCompletion`: Request for flow-based chat completion
77
- - `FlowRequest`: Request for creating/updating flows
78
- - `ApiTokenRequest`: Request for creating API tokens
79
- - `AddCreditRequest`: Request for adding credits
80
-
81
- ### Client Methods
82
-
83
- #### Model Operations
84
- - `list_models()`: List available models
85
- - `generate(request: AiRequest)`: Generate text using specified model
86
-
87
- #### Flow Operations
88
- - `list_flows()`: List all flows
89
- - `get_flow(flow_id: str)`: Get flow details
90
- - `create_flow(request: FlowRequest)`: Create new flow
91
- - `update_flow(flow_id: str, request: FlowRequest)`: Update flow
92
- - `delete_flow(flow_id: str)`: Delete flow
93
- - `generate_with_flow(flow_id: str, request: FlowChatCompletion)`: Generate using flow
94
-
95
- #### Token Operations
96
- - `create_api_token(request: ApiTokenRequest)`: Create API token
97
- - `list_api_tokens()`: List API tokens
98
- - `delete_api_token(token: str)`: Delete API token
99
-
100
- #### Credit Operations
101
- - `get_user_credits()`: Get credit information
102
- - `add_credit(request: AddCreditRequest)`: Add credits
103
- - `get_credits_history()`: Get credit history
104
-
105
- ## License
106
-
107
- MIT License
@@ -1,7 +0,0 @@
1
- mira_network-0.1.2.dist-info/METADATA,sha256=KrCNwQMJqIY3acFF9c00JXWnCnAm0Z_SArKg4dLO8_k,2915
2
- mira_network-0.1.2.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
- mira_network-0.1.2.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
4
- mira_sdk/__init__.py,sha256=KVFj7e20pprJuOWCG9Ky_w2JqKBu8TFPCilPDKRhkyI,364
5
- mira_sdk/client.py,sha256=F0E0ATGZXOsozbp91P6MLma5-pgT0rCo0BaEIz-yKDk,5769
6
- mira_sdk/models.py,sha256=FQfxjK_Cs7Nt0dB1qYHd7rov3VJSVr6rNAqZqOarU48,1749
7
- mira_network-0.1.2.dist-info/RECORD,,
mira_sdk/client.py DELETED
@@ -1,180 +0,0 @@
1
- from typing import Optional, List, Dict, AsyncGenerator, Union
2
- import httpx
3
- from mira_sdk.models import (
4
- Message,
5
- ModelProvider,
6
- AiRequest,
7
- FlowChatCompletion,
8
- FlowRequest,
9
- ApiTokenRequest,
10
- AddCreditRequest,
11
- )
12
-
13
-
14
- class MiraClient:
15
- def __init__(self, base_url: str, api_token: Optional[str] = None):
16
- """Initialize Mira client.
17
-
18
- Args:
19
- base_url: Base URL of the Mira API
20
- api_token: Optional API token for authentication
21
- """
22
- self.base_url = base_url
23
- self.api_token = api_token
24
- self._client = httpx.AsyncClient()
25
-
26
- async def __aenter__(self):
27
- return self
28
-
29
- async def __aexit__(self, exc_type, exc_val, exc_tb):
30
- await self._client.aclose()
31
-
32
- def _get_headers(self) -> Dict[str, str]:
33
- headers = {"Content-Type": "application/json"}
34
- if self.api_token:
35
- headers["Authorization"] = f"Bearer {self.api_token}"
36
- return headers
37
-
38
- async def list_models(self) -> List[str]:
39
- """List available models."""
40
- response = await self._client.get(
41
- f"{self.base_url}/v1/models",
42
- headers=self._get_headers(),
43
- )
44
- response.raise_for_status()
45
- return response.json()
46
-
47
- async def generate(
48
- self, request: AiRequest
49
- ) -> Union[str, AsyncGenerator[str, None]]:
50
- """Generate text using the specified model."""
51
- response = await self._client.post(
52
- f"{self.base_url}/v1/chat/completions",
53
- headers=self._get_headers(),
54
- json=request.model_dump(),
55
- )
56
-
57
- response.raise_for_status()
58
-
59
- if request.stream:
60
-
61
- async def stream_response():
62
- async for chunk in response.aiter_text():
63
- yield chunk
64
-
65
- return stream_response()
66
- else:
67
- return response.json()
68
-
69
- async def generate_with_flow(
70
- self, flow_id: str, request: FlowChatCompletion
71
- ) -> Union[str, AsyncGenerator[str, None]]:
72
- """Generate text using a specific flow."""
73
- response = await self._client.post(
74
- f"{self.base_url}/v1/flows/{flow_id}/chat/completions",
75
- headers=self._get_headers(),
76
- json=request.model_dump(),
77
- )
78
- response.raise_for_status()
79
- return response.json()
80
-
81
- async def list_flows(self) -> List[Dict]:
82
- """List all flows."""
83
- response = await self._client.get(
84
- f"{self.base_url}/flows",
85
- headers=self._get_headers(),
86
- )
87
- response.raise_for_status()
88
- return response.json()
89
-
90
- async def get_flow(self, flow_id: str) -> Dict:
91
- """Get details of a specific flow."""
92
- response = await self._client.get(
93
- f"{self.base_url}/flows/{flow_id}",
94
- headers=self._get_headers(),
95
- )
96
- response.raise_for_status()
97
- return response.json()
98
-
99
- async def create_flow(self, request: FlowRequest) -> Dict:
100
- """Create a new flow."""
101
- response = await self._client.post(
102
- f"{self.base_url}/flows",
103
- headers=self._get_headers(),
104
- json=request.model_dump(),
105
- )
106
- response.raise_for_status()
107
- return response.json()
108
-
109
- async def update_flow(self, flow_id: str, request: FlowRequest) -> Dict:
110
- """Update an existing flow."""
111
- response = await self._client.put(
112
- f"{self.base_url}/flows/{flow_id}",
113
- headers=self._get_headers(),
114
- json=request.model_dump(),
115
- )
116
- response.raise_for_status()
117
- return response.json()
118
-
119
- async def delete_flow(self, flow_id: str) -> None:
120
- """Delete a flow."""
121
- response = await self._client.delete(
122
- f"{self.base_url}/flows/{flow_id}",
123
- headers=self._get_headers(),
124
- )
125
- response.raise_for_status()
126
-
127
- async def create_api_token(self, request: ApiTokenRequest) -> Dict:
128
- """Create a new API token."""
129
- response = await self._client.post(
130
- f"{self.base_url}/tokens",
131
- headers=self._get_headers(),
132
- json=request.model_dump(),
133
- )
134
- response.raise_for_status()
135
- return response.json()
136
-
137
- async def list_api_tokens(self) -> List[Dict]:
138
- """List all API tokens."""
139
- response = await self._client.get(
140
- f"{self.base_url}/tokens",
141
- headers=self._get_headers(),
142
- )
143
- response.raise_for_status()
144
- return response.json()
145
-
146
- async def delete_api_token(self, token: str) -> None:
147
- """Delete an API token."""
148
- response = await self._client.delete(
149
- f"{self.base_url}/tokens/{token}",
150
- headers=self._get_headers(),
151
- )
152
- response.raise_for_status()
153
-
154
- async def get_user_credits(self) -> Dict:
155
- """Get user credits information."""
156
- response = await self._client.get(
157
- f"{self.base_url}/credits",
158
- headers=self._get_headers(),
159
- )
160
- response.raise_for_status()
161
- return response.json()
162
-
163
- async def add_credit(self, request: AddCreditRequest) -> Dict:
164
- """Add credits to a user account."""
165
- response = await self._client.post(
166
- f"{self.base_url}/credits",
167
- headers=self._get_headers(),
168
- json=request.model_dump(),
169
- )
170
- response.raise_for_status()
171
- return response.json()
172
-
173
- async def get_credits_history(self) -> List[Dict]:
174
- """Get user credits history."""
175
- response = await self._client.get(
176
- f"{self.base_url}/credits/history",
177
- headers=self._get_headers(),
178
- )
179
- response.raise_for_status()
180
- return response.json()