spaik-sdk 0.6.4__py3-none-any.whl → 0.6.5__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.
- spaik_sdk/agent/base_agent.py +1 -4
- spaik_sdk/config/env.py +0 -11
- spaik_sdk/models/providers/azure_provider.py +34 -10
- spaik_sdk/server/api/routers/audio_router_factory.py +1 -1
- spaik_sdk/server/authorization/base_authorizer.py +1 -1
- spaik_sdk/tracing/agent_trace.py +1 -3
- {spaik_sdk-0.6.4.dist-info → spaik_sdk-0.6.5.dist-info}/METADATA +1 -1
- {spaik_sdk-0.6.4.dist-info → spaik_sdk-0.6.5.dist-info}/RECORD +9 -9
- {spaik_sdk-0.6.4.dist-info → spaik_sdk-0.6.5.dist-info}/WHEEL +0 -0
spaik_sdk/agent/base_agent.py
CHANGED
|
@@ -17,7 +17,6 @@ from spaik_sdk.llm.cost.cost_provider import CostProvider
|
|
|
17
17
|
from spaik_sdk.llm.langchain_service import LangChainService
|
|
18
18
|
from spaik_sdk.models.llm_config import LLMConfig
|
|
19
19
|
from spaik_sdk.models.llm_model import LLMModel
|
|
20
|
-
from spaik_sdk.models.providers.provider_type import ProviderType
|
|
21
20
|
from spaik_sdk.prompt.get_prompt_loader import get_prompt_loader
|
|
22
21
|
from spaik_sdk.prompt.prompt_loader import PromptLoader
|
|
23
22
|
from spaik_sdk.prompt.prompt_loader_mode import PromptLoaderMode
|
|
@@ -147,11 +146,9 @@ class BaseAgent(ABC):
|
|
|
147
146
|
if llm_model is None:
|
|
148
147
|
llm_model = self.get_llm_model()
|
|
149
148
|
|
|
150
|
-
provider_type = ProviderType.from_family(llm_model.family)
|
|
151
|
-
|
|
152
149
|
return LLMConfig(
|
|
153
150
|
model=llm_model,
|
|
154
|
-
provider_type=
|
|
151
|
+
provider_type=env_config.get_provider_type(),
|
|
155
152
|
reasoning=reasoning if reasoning is not None else llm_model.reasoning,
|
|
156
153
|
tool_usage=len(self.tools) > 0,
|
|
157
154
|
)
|
spaik_sdk/config/env.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import Dict
|
|
3
2
|
from typing import Optional as OptionalType
|
|
4
3
|
|
|
5
4
|
from spaik_sdk.models.llm_model import LLMModel
|
|
@@ -16,16 +15,6 @@ class EnvConfig:
|
|
|
16
15
|
raise ValueError(f"Environment variable {key} is required but not set")
|
|
17
16
|
return value
|
|
18
17
|
|
|
19
|
-
def get_azure_keys(self) -> Dict[str, str]:
|
|
20
|
-
return {
|
|
21
|
-
"api_key": self.get_key("AZURE_API_KEY"),
|
|
22
|
-
"api_version": self.get_key("AZURE_API_VERSION"),
|
|
23
|
-
"endpoint": self.get_key("AZURE_ENDPOINT"),
|
|
24
|
-
"o3-mini_deployment": self.get_key("AZURE_O3_MINI_DEPLOYMENT", required=False),
|
|
25
|
-
"gpt-4_1_deployment": self.get_key("AZURE_GPT_4_1_DEPLOYMENT", required=False),
|
|
26
|
-
"gpt-4o_deployment": self.get_key("AZURE_GPT_4O_DEPLOYMENT", required=False),
|
|
27
|
-
}
|
|
28
|
-
|
|
29
18
|
def get_default_model(self) -> LLMModel:
|
|
30
19
|
return ModelRegistry.from_name(self.get_key("DEFAULT_MODEL"))
|
|
31
20
|
|
|
@@ -1,31 +1,55 @@
|
|
|
1
|
+
import os
|
|
1
2
|
from typing import Any, Collection, Dict
|
|
2
3
|
|
|
3
4
|
from langchain_core.language_models.chat_models import BaseChatModel
|
|
4
5
|
from langchain_openai import AzureChatOpenAI
|
|
5
6
|
|
|
6
|
-
from spaik_sdk.config.env import env_config
|
|
7
7
|
from spaik_sdk.models.factories.openai_factory import OpenAIModelFactory
|
|
8
8
|
from spaik_sdk.models.llm_config import LLMConfig
|
|
9
9
|
from spaik_sdk.models.llm_model import LLMModel
|
|
10
10
|
from spaik_sdk.models.providers.base_provider import BaseProvider
|
|
11
11
|
|
|
12
|
+
# Model name -> Environment variable for Azure deployment name
|
|
13
|
+
AZURE_DEPLOYMENT_ENV_VARS: Dict[str, str] = {
|
|
14
|
+
"gpt-4.1": "AZURE_GPT_4_1_DEPLOYMENT",
|
|
15
|
+
"gpt-4o": "AZURE_GPT_4O_DEPLOYMENT",
|
|
16
|
+
"o4-mini": "AZURE_O4_MINI_DEPLOYMENT",
|
|
17
|
+
"o4-mini-2025-04-16": "AZURE_O4_MINI_2025_04_16_DEPLOYMENT",
|
|
18
|
+
"gpt-5": "AZURE_GPT_5_DEPLOYMENT",
|
|
19
|
+
"gpt-5-mini": "AZURE_GPT_5_MINI_DEPLOYMENT",
|
|
20
|
+
"gpt-5-nano": "AZURE_GPT_5_NANO_DEPLOYMENT",
|
|
21
|
+
"gpt-5.1": "AZURE_GPT_5_1_DEPLOYMENT",
|
|
22
|
+
"gpt-5.1-codex": "AZURE_GPT_5_1_CODEX_DEPLOYMENT",
|
|
23
|
+
"gpt-5.1-codex-mini": "AZURE_GPT_5_1_CODEX_MINI_DEPLOYMENT",
|
|
24
|
+
"gpt-5.1-codex-max": "AZURE_GPT_5_1_CODEX_MAX_DEPLOYMENT",
|
|
25
|
+
"gpt-5.2": "AZURE_GPT_5_2_DEPLOYMENT",
|
|
26
|
+
"gpt-5.2-pro": "AZURE_GPT_5_2_PRO_DEPLOYMENT",
|
|
27
|
+
}
|
|
28
|
+
|
|
12
29
|
|
|
13
30
|
class AzureProvider(BaseProvider):
|
|
14
31
|
def get_supported_models(self) -> Collection[LLMModel]:
|
|
15
|
-
"""Get list of models supported by Azure provider."""
|
|
16
32
|
return OpenAIModelFactory.MODELS
|
|
17
33
|
|
|
18
34
|
def get_model_config(self, config: LLMConfig) -> Dict[str, Any]:
|
|
19
|
-
"""Get Azure AI Foundry provider configuration (provider-specific only)."""
|
|
20
35
|
return {
|
|
21
|
-
"api_key":
|
|
22
|
-
"api_version":
|
|
23
|
-
"azure_endpoint":
|
|
36
|
+
"api_key": self._get_required_env("AZURE_API_KEY"),
|
|
37
|
+
"api_version": self._get_required_env("AZURE_API_VERSION"),
|
|
38
|
+
"azure_endpoint": self._get_required_env("AZURE_ENDPOINT"),
|
|
24
39
|
}
|
|
25
40
|
|
|
26
41
|
def create_langchain_model(self, config: LLMConfig, full_config: Dict[str, Any]) -> BaseChatModel:
|
|
27
|
-
""
|
|
28
|
-
# Add Azure provider-specific deployment configuration
|
|
29
|
-
full_config["deployment_name"] = env_config.get_azure_keys()[f"{config.model.name.lower()}_deployment"]
|
|
30
|
-
|
|
42
|
+
full_config["deployment_name"] = self._get_deployment_name(config.model.name)
|
|
31
43
|
return AzureChatOpenAI(**full_config)
|
|
44
|
+
|
|
45
|
+
def _get_deployment_name(self, model_name: str) -> str:
|
|
46
|
+
env_var = AZURE_DEPLOYMENT_ENV_VARS.get(model_name)
|
|
47
|
+
if not env_var:
|
|
48
|
+
raise ValueError(f"Model '{model_name}' not supported on Azure. Add it to AZURE_DEPLOYMENT_ENV_VARS.")
|
|
49
|
+
return os.environ.get(env_var, model_name)
|
|
50
|
+
|
|
51
|
+
def _get_required_env(self, key: str) -> str:
|
|
52
|
+
value = os.environ.get(key)
|
|
53
|
+
if not value:
|
|
54
|
+
raise ValueError(f"Environment variable {key} is required but not set")
|
|
55
|
+
return value
|
|
@@ -178,7 +178,7 @@ class AudioRouterFactory:
|
|
|
178
178
|
try:
|
|
179
179
|
audio_bytes = await file.read()
|
|
180
180
|
filename = file.filename or "audio.webm"
|
|
181
|
-
|
|
181
|
+
|
|
182
182
|
logger.info(f"STT request: language={language}, filename={filename}, size={len(audio_bytes)}")
|
|
183
183
|
|
|
184
184
|
options = STTOptions(
|
|
@@ -54,7 +54,7 @@ class BaseAuthorizer(ABC, Generic[TUser]):
|
|
|
54
54
|
|
|
55
55
|
async def can_read_file(self, user: TUser, file_metadata: "FileMetadata") -> bool:
|
|
56
56
|
"""Check if user has permission to read a file.
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
By default, users can read files they own, or files owned by 'system' (agent-generated).
|
|
59
59
|
"""
|
|
60
60
|
return file_metadata.owner_id == user.get_id() or file_metadata.owner_id == "system"
|
spaik_sdk/tracing/agent_trace.py
CHANGED
|
@@ -73,6 +73,4 @@ class AgentTrace:
|
|
|
73
73
|
|
|
74
74
|
def save(self, name: str) -> None:
|
|
75
75
|
trace_content = self.to_string(include_system_prompt=False)
|
|
76
|
-
self._trace_sink.save_trace(
|
|
77
|
-
name, trace_content, self.system_prompt, self.agent_instance_id
|
|
78
|
-
)
|
|
76
|
+
self._trace_sink.save_trace(name, trace_content, self.system_prompt, self.agent_instance_id)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spaik-sdk
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.5
|
|
4
4
|
Summary: Python SDK for building AI agents with multi-LLM support, streaming, and production-ready infrastructure
|
|
5
5
|
Project-URL: Homepage, https://github.com/siilisolutions/spaik-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/siilisolutions/spaik-sdk
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
spaik_sdk/__init__.py,sha256=UhJdqPEBVFTlyWHPicbcpcvOuOqmObenwnJv_GkPbVA,576
|
|
2
2
|
spaik_sdk/py.typed,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
|
3
3
|
spaik_sdk/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
spaik_sdk/agent/base_agent.py,sha256=
|
|
4
|
+
spaik_sdk/agent/base_agent.py,sha256=KuIsiLtZlthYNNimA5569BxgUvoMFuYcQZuzIBvYoMU,10920
|
|
5
5
|
spaik_sdk/attachments/__init__.py,sha256=ckqaKkl8rCVg-V8hNkE_RG57peYkt1zMWTszSRgWZeE,678
|
|
6
6
|
spaik_sdk/attachments/builder.py,sha256=WgB14KcZ491KqjY6QMeIYXS18KElqsnvO-XAc7wuP0s,1758
|
|
7
7
|
spaik_sdk/attachments/file_storage_provider.py,sha256=3EKDCCfhKi2iDpLR3BMsKt9KCR8iFvUZz2LV8cMFs3s,692
|
|
@@ -21,7 +21,7 @@ spaik_sdk/audio/providers/google_tts.py,sha256=-7gohXszE_A3sFQbiMp3kk1VZBhGFyLkx
|
|
|
21
21
|
spaik_sdk/audio/providers/openai_stt.py,sha256=ZD44obwqOTmvnmvPcD6RQu4cL6B4rWkMmSmLwlEeoQY,2078
|
|
22
22
|
spaik_sdk/audio/providers/openai_tts.py,sha256=SHfav2hgPnk84Dy784XcJHAGQ7PgUcUuwvq2eU4ceW0,3436
|
|
23
23
|
spaik_sdk/config/credentials_provider.py,sha256=mfaAUb8yRr9VEHqwxxIGlbXv-_v7ZnmaBxqDmq9SRys,299
|
|
24
|
-
spaik_sdk/config/env.py,sha256=
|
|
24
|
+
spaik_sdk/config/env.py,sha256=xBEBq7yvOjxy59KhNhBIHGm0DwVelHC1LQeo4Pky4eQ,2208
|
|
25
25
|
spaik_sdk/config/env_credentials_provider.py,sha256=Y4Tti-T3IAAFQDV2rTsBaa3mngZcJ6RBY6Pk1TMmJRM,307
|
|
26
26
|
spaik_sdk/config/get_credentials_provider.py,sha256=D2EF3ezConXlCmNvl9mQTSoR3BsIlDmxKM0a7jgGym8,516
|
|
27
27
|
spaik_sdk/image_gen/__init__.py,sha256=AEujgMjNTj0y0x5EPsbX8IV9MB_UXDRjf3nc3Sc7Ou4,245
|
|
@@ -66,7 +66,7 @@ spaik_sdk/models/factories/ollama_factory.py,sha256=7RXPlbF7b-wJA45FluSGkVIzMXdH
|
|
|
66
66
|
spaik_sdk/models/factories/openai_factory.py,sha256=LvKx5ueuL3uROfI453BQSq6vuLFHJwMzLVqIbeg4G9s,2489
|
|
67
67
|
spaik_sdk/models/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
68
|
spaik_sdk/models/providers/anthropic_provider.py,sha256=NY_K8cbph5PKMRdKWOY4iw2C6wUZtnZ4id8DGwuKv1M,1329
|
|
69
|
-
spaik_sdk/models/providers/azure_provider.py,sha256=
|
|
69
|
+
spaik_sdk/models/providers/azure_provider.py,sha256=Myqt6el7uDg8yGtGkaNJJEM6Gl3-Sf6msS1fPPHit8U,2369
|
|
70
70
|
spaik_sdk/models/providers/base_provider.py,sha256=RoAyUAVMxHIVrYXgz9mHX2hfCfMj1qI-B9Y8g2YmRVk,2392
|
|
71
71
|
spaik_sdk/models/providers/google_provider.py,sha256=HVl9tQaAiUX9orM9v5zwTKMhYYGrPLSPRVZ5hso8-_g,1180
|
|
72
72
|
spaik_sdk/models/providers/ollama_provider.py,sha256=7BnAb5rdeTyc8EKy39OquuOyMexULC53FdxtvhHdHvY,1099
|
|
@@ -92,7 +92,7 @@ spaik_sdk/recording/impl/local_recorder.py,sha256=6v7ARykjseSskenvsaBU5UcgOJ15e8
|
|
|
92
92
|
spaik_sdk/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
93
93
|
spaik_sdk/server/api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
94
94
|
spaik_sdk/server/api/routers/api_builder.py,sha256=svuqLYJJWam7I5Aywg9ncHtB6YS8MStv28-UoLbMYX0,6655
|
|
95
|
-
spaik_sdk/server/api/routers/audio_router_factory.py,sha256=
|
|
95
|
+
spaik_sdk/server/api/routers/audio_router_factory.py,sha256=5MyUzWSPpYrQr7eAh9DczIs_FyQw-EKaAMWXUKM1Evw,7353
|
|
96
96
|
spaik_sdk/server/api/routers/file_router_factory.py,sha256=0nT-L61AcCr6Z7jsXJgGPPDucho1MzoA8jDYbx5OQHs,4020
|
|
97
97
|
spaik_sdk/server/api/routers/thread_router_factory.py,sha256=h8nCA0-a26WnKHOR9QvaBnQ6ezXn8sIsG21Vf1qfBB0,14183
|
|
98
98
|
spaik_sdk/server/api/streaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -100,7 +100,7 @@ spaik_sdk/server/api/streaming/format_sse_event.py,sha256=EEBxbXL_Dbne30Lv31JeNp
|
|
|
100
100
|
spaik_sdk/server/api/streaming/negotiate_streaming_response.py,sha256=InamT7fTY99tUkcuT-68CmH1JB9Nult0Jp4qzpAeKUk,149
|
|
101
101
|
spaik_sdk/server/api/streaming/streaming_negotiator.py,sha256=xfjgm_GRfh0VV9Fw_5fimz3eyb5VMKSlzlAoVn4euf8,369
|
|
102
102
|
spaik_sdk/server/authorization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
103
|
-
spaik_sdk/server/authorization/base_authorizer.py,sha256=
|
|
103
|
+
spaik_sdk/server/authorization/base_authorizer.py,sha256=5geuXut1h3OArGWjJRpaknHmV_LBPZQUz3WSfwJ_F0M,2620
|
|
104
104
|
spaik_sdk/server/authorization/base_user.py,sha256=x3bthycXLy_ws3xKH3ZSb_84ho1qymdlOQTWrfqqmXo,274
|
|
105
105
|
spaik_sdk/server/authorization/dummy_authorizer.py,sha256=uaMW916GISBFopzydhmUIU7ClZKb8rS7wiL5LwrD-kM,573
|
|
106
106
|
spaik_sdk/server/job_processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -149,7 +149,7 @@ spaik_sdk/tools/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
149
149
|
spaik_sdk/tools/impl/mcp_tool_provider.py,sha256=g2ULJkTW7J3nyXI43RdrTj-AzFtMiGCP5Aog79vKnMI,2750
|
|
150
150
|
spaik_sdk/tools/impl/search_tool_provider.py,sha256=fi8SBmvC7--n0cCNaTz6PhEe6Bf4RkyrxYkqKzEDlY4,515
|
|
151
151
|
spaik_sdk/tracing/__init__.py,sha256=kmLFmy1Lb7bS2sryIFoFaknxYXlyuswuP_4gHmwEtv0,526
|
|
152
|
-
spaik_sdk/tracing/agent_trace.py,sha256=
|
|
152
|
+
spaik_sdk/tracing/agent_trace.py,sha256=9G2WHQOiVL_HOnlD8Qz2DHtd1Trldqg4jqcFDPGPf_w,3017
|
|
153
153
|
spaik_sdk/tracing/get_trace_sink.py,sha256=ZPg8pVLS1BbY0PwXJXC-O8qSvUvQSzmDb4SWRtsRSSc,2573
|
|
154
154
|
spaik_sdk/tracing/local_trace_sink.py,sha256=QTqkzDv8S0cLtRvScwPmejnj6EpccYaHFjd7KkP9Xrk,984
|
|
155
155
|
spaik_sdk/tracing/noop_trace_sink.py,sha256=AxImIYh8MPzISTp6qDp8ShtWyPLVqLRwsh7yyAVDSjs,540
|
|
@@ -157,6 +157,6 @@ spaik_sdk/tracing/trace_sink.py,sha256=LU6aF848Kz2hMZuz0q6l-4IaD0sC-ex0AKFk8mVTS
|
|
|
157
157
|
spaik_sdk/tracing/trace_sink_mode.py,sha256=74qiL4P3sNVGM3_DUkWKlqlu9UvT928NLKTskD_vxgk,791
|
|
158
158
|
spaik_sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
159
159
|
spaik_sdk/utils/init_logger.py,sha256=htxNtHMxRXVNAXBbS9f6Wmd0aET7kl3ClJ062b3YHmQ,791
|
|
160
|
-
spaik_sdk-0.6.
|
|
161
|
-
spaik_sdk-0.6.
|
|
162
|
-
spaik_sdk-0.6.
|
|
160
|
+
spaik_sdk-0.6.5.dist-info/METADATA,sha256=xBhp5B6_3ia1AWf1sPVPztbCe_-9Ac7a7_DlPa3zeV4,10085
|
|
161
|
+
spaik_sdk-0.6.5.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
162
|
+
spaik_sdk-0.6.5.dist-info/RECORD,,
|
|
File without changes
|