11"""Edgee Gateway SDK for Python"""
22
3- import os
43import json
5- from typing import Optional , Union
4+ import os
65from dataclasses import dataclass
7- from urllib .request import Request , urlopen
86from urllib .error import HTTPError
7+ from urllib .request import Request , urlopen
8+
9+ # API Configuration
10+ DEFAULT_BASE_URL = "https://api.edgee.ai"
11+ API_ENDPOINT = "/v1/chat/completions"
912
1013
1114@dataclass
1215class FunctionDefinition :
1316 name : str
14- description : Optional [ str ] = None
15- parameters : Optional [ dict ] = None
17+ description : str | None = None
18+ parameters : dict | None = None
1619
1720
1821@dataclass
@@ -31,24 +34,24 @@ class ToolCall:
3134@dataclass
3235class Message :
3336 role : str # "system" | "user" | "assistant" | "tool"
34- content : Optional [ str ] = None
35- name : Optional [ str ] = None
36- tool_calls : Optional [ list [ToolCall ]] = None
37- tool_call_id : Optional [ str ] = None
37+ content : str | None = None
38+ name : str | None = None
39+ tool_calls : list [ToolCall ] | None = None
40+ tool_call_id : str | None = None
3841
3942
4043@dataclass
4144class InputObject :
4245 messages : list [dict ]
43- tools : Optional [ list [dict ]] = None
44- tool_choice : Optional [ Union [ str , dict ]] = None
46+ tools : list [dict ] | None = None
47+ tool_choice : str | dict | None = None
4548
4649
4750@dataclass
4851class Choice :
4952 index : int
5053 message : dict
51- finish_reason : Optional [ str ]
54+ finish_reason : str | None
5255
5356
5457@dataclass
@@ -61,43 +64,44 @@ class Usage:
6164@dataclass
6265class SendResponse :
6366 choices : list [Choice ]
64- usage : Optional [ Usage ] = None
67+ usage : Usage | None = None
6568
6669
6770@dataclass
6871class EdgeeConfig :
69- api_key : Optional [ str ] = None
70- base_url : Optional [ str ] = None
72+ api_key : str | None = None
73+ base_url : str | None = None
7174
7275
7376class Edgee :
7477 def __init__ (
7578 self ,
76- config : Optional [ Union [ str , EdgeeConfig , dict ]] = None ,
79+ config : str | EdgeeConfig | dict | None = None ,
7780 ):
78- api_key : Optional [str ] = None
79- base_url : Optional [str ] = None
80-
8181 if isinstance (config , str ):
8282 # Backward compatibility: accept api_key as string
8383 api_key = config
84+ base_url = None
8485 elif isinstance (config , EdgeeConfig ):
8586 api_key = config .api_key
8687 base_url = config .base_url
8788 elif isinstance (config , dict ):
8889 api_key = config .get ("api_key" )
8990 base_url = config .get ("base_url" )
91+ else :
92+ api_key = None
93+ base_url = None
9094
9195 self .api_key = api_key or os .environ .get ("EDGEE_API_KEY" , "" )
9296 if not self .api_key :
9397 raise ValueError ("EDGEE_API_KEY is not set" )
9498
95- self .base_url = base_url or os .environ .get ("EDGEE_BASE_URL" , "https://api.edgee.ai" )
99+ self .base_url = base_url or os .environ .get ("EDGEE_BASE_URL" , DEFAULT_BASE_URL )
96100
97101 def send (
98102 self ,
99103 model : str ,
100- input : Union [ str , InputObject , dict ] ,
104+ input : str | InputObject | dict ,
101105 ) -> SendResponse :
102106 """Send a completion request to the Edgee AI Gateway."""
103107
@@ -121,7 +125,7 @@ def send(
121125 body ["tool_choice" ] = tool_choice
122126
123127 request = Request (
124- f"{ self .base_url } /v1/chat/completions " ,
128+ f"{ self .base_url } { API_ENDPOINT } " ,
125129 data = json .dumps (body ).encode ("utf-8" ),
126130 headers = {
127131 "Content-Type" : "application/json" ,
0 commit comments