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.
@@ -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=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": env_config.get_azure_keys()["api_key"],
22
- "api_version": env_config.get_azure_keys()["api_version"],
23
- "azure_endpoint": env_config.get_azure_keys()["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
- """Create Azure langchain model with complete configuration and model-specific deployments."""
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"
@@ -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.4
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=sk1Q3ediUHm6hOVIIAv90XwXAL7pSrlLcDIm7qtG6z0,11037
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=H4xdFhRqoE64Rj6J0DM_J_zaq10seh2WpDRldNmxaZI,2754
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=Ddzhmi1TCWleAMJx1qoagxxMEfv8Tot46h15eocS-Bg,1453
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=x0W7reFAVerdUqUkKn_rc4WvVyIaMHckbDuESGUmOhY,7369
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=ry_r_uBMoJoI179Fk_THiqjTQovJW-Hw1VjIuDeQ2xw,2628
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=ORxHCiilgElebx7O5CyZtwgeWTiruB7sFky98xgsf_M,3039
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.4.dist-info/METADATA,sha256=Si8vJmRo18czibAqovNT87HsVqPl9nxqz-ztBYG90DM,10085
161
- spaik_sdk-0.6.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
162
- spaik_sdk-0.6.4.dist-info/RECORD,,
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,,