Skip to content

Commit 84e6a80

Browse files
committed
Add get_estimated_price
1 parent 435d697 commit 84e6a80

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

src/aleph/sdk/client/abstract.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020

2121
from aleph_message.models import (
2222
AlephMessage,
23+
InstanceContent,
2324
ItemHash,
2425
ItemType,
2526
MessagesResponse,
2627
MessageType,
2728
Payment,
2829
PostMessage,
30+
ProgramContent,
2931
parse_message,
3032
)
3133
from aleph_message.models.execution.environment import (
@@ -242,6 +244,18 @@ def watch_messages(
242244
"""
243245
raise NotImplementedError("Did you mean to import `AlephHttpClient`?")
244246

247+
@abstractmethod
248+
def get_estimated_price(
249+
self,
250+
content: ProgramContent | InstanceContent,
251+
) -> Coroutine[Any, Any, PriceResponse]:
252+
"""
253+
Get Instance/Program content estimated price
254+
255+
:param content: Instance or Program content
256+
"""
257+
raise NotImplementedError("Did you mean to import `AlephHttpClient`?")
258+
245259
@abstractmethod
246260
def get_program_price(
247261
self,

src/aleph/sdk/client/http.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import logging
33
import os.path
44
import ssl
5+
import time
56
from io import BytesIO
67
from pathlib import Path
78
from typing import (
@@ -20,7 +21,15 @@
2021
import aiohttp
2122
from aiohttp.web import HTTPNotFound
2223
from aleph_message import parse_message
23-
from aleph_message.models import AlephMessage, ItemHash, ItemType, MessageType
24+
from aleph_message.models import (
25+
AlephMessage,
26+
Chain,
27+
InstanceContent,
28+
ItemHash,
29+
ItemType,
30+
MessageType,
31+
ProgramContent,
32+
)
2433
from aleph_message.status import MessageStatus
2534
from pydantic import ValidationError
2635

@@ -37,6 +46,7 @@
3746
from ..utils import (
3847
Writable,
3948
check_unix_socket_valid,
49+
compute_sha256,
4050
copy_async_readable_to_buffer,
4151
extended_json_encoder,
4252
get_message_type_value,
@@ -448,6 +458,44 @@ async def watch_messages(
448458
elif msg.type == aiohttp.WSMsgType.ERROR:
449459
break
450460

461+
async def get_estimated_price(
462+
self,
463+
content: ProgramContent | InstanceContent,
464+
) -> PriceResponse:
465+
item_content: str = json.dumps(
466+
content, separators=(",", ":"), default=extended_json_encoder
467+
)
468+
message = parse_message(
469+
dict(
470+
sender=content.address,
471+
chain=Chain.ETH,
472+
type=(
473+
MessageType.program
474+
if isinstance(content, ProgramContent)
475+
else MessageType.instance
476+
),
477+
content=content.dict(exclude_none=True),
478+
item_content=item_content,
479+
time=time.time(),
480+
channel=settings.DEFAULT_CHANNEL,
481+
item_type=ItemType.inline,
482+
item_hash=compute_sha256(item_content),
483+
)
484+
)
485+
486+
async with self.http_session.post(
487+
"/api/v0/price/estimate", json=dict(message=message)
488+
) as resp:
489+
try:
490+
resp.raise_for_status()
491+
response_json = await resp.json()
492+
return PriceResponse(
493+
required_tokens=response_json["required_tokens"],
494+
payment_type=response_json["payment_type"],
495+
)
496+
except aiohttp.ClientResponseError as e:
497+
raise e
498+
451499
async def get_program_price(self, item_hash: str) -> PriceResponse:
452500
async with self.http_session.get(f"/api/v0/price/{item_hash}") as resp:
453501
try:

0 commit comments

Comments
 (0)