spaik-sdk 0.6.3__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.
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ import uuid
2
3
  from abc import ABC
3
4
  from typing import Any, AsyncGenerator, Dict, List, Optional, Type, TypeVar
4
5
 
@@ -16,7 +17,6 @@ from spaik_sdk.llm.cost.cost_provider import CostProvider
16
17
  from spaik_sdk.llm.langchain_service import LangChainService
17
18
  from spaik_sdk.models.llm_config import LLMConfig
18
19
  from spaik_sdk.models.llm_model import LLMModel
19
- from spaik_sdk.models.providers.provider_type import ProviderType
20
20
  from spaik_sdk.prompt.get_prompt_loader import get_prompt_loader
21
21
  from spaik_sdk.prompt.prompt_loader import PromptLoader
22
22
  from spaik_sdk.prompt.prompt_loader_mode import PromptLoaderMode
@@ -57,9 +57,16 @@ class BaseAgent(ABC):
57
57
  cost_provider: Optional[CostProvider] = None,
58
58
  ):
59
59
  logger.debug("Initializing BaseAgent")
60
+ # Generate unique instance ID for trace correlation
61
+ self.agent_instance_id: str = str(uuid.uuid4())
60
62
  self.prompt_loader = prompt_loader or get_prompt_loader(prompt_loader_mode)
61
63
  self.system_prompt = system_prompt or self._get_system_prompt(system_prompt_args, system_prompt_version)
62
- self.trace = trace or AgentTrace(self.system_prompt, self.__class__.__name__, trace_sink=trace_sink)
64
+ self.trace = trace or AgentTrace(
65
+ self.system_prompt,
66
+ self.__class__.__name__,
67
+ trace_sink=trace_sink,
68
+ agent_instance_id=self.agent_instance_id,
69
+ )
63
70
  self.thread_container = thread_container or ThreadContainer(self.system_prompt)
64
71
  self.tools = tools or self._create_tools(tool_providers)
65
72
  self.llm_config = llm_config or self.create_llm_config(llm_model, reasoning)
@@ -139,11 +146,9 @@ class BaseAgent(ABC):
139
146
  if llm_model is None:
140
147
  llm_model = self.get_llm_model()
141
148
 
142
- provider_type = ProviderType.from_family(llm_model.family)
143
-
144
149
  return LLMConfig(
145
150
  model=llm_model,
146
- provider_type=provider_type,
151
+ provider_type=env_config.get_provider_type(),
147
152
  reasoning=reasoning if reasoning is not None else llm_model.reasoning,
148
153
  tool_usage=len(self.tools) > 0,
149
154
  )
spaik_sdk/config/env.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import os
2
- from typing import Dict
2
+ from typing import Optional as OptionalType
3
3
 
4
4
  from spaik_sdk.models.llm_model import LLMModel
5
5
  from spaik_sdk.models.model_registry import ModelRegistry
@@ -15,16 +15,6 @@ class EnvConfig:
15
15
  raise ValueError(f"Environment variable {key} is required but not set")
16
16
  return value
17
17
 
18
- def get_azure_keys(self) -> Dict[str, str]:
19
- return {
20
- "api_key": self.get_key("AZURE_API_KEY"),
21
- "api_version": self.get_key("AZURE_API_VERSION"),
22
- "endpoint": self.get_key("AZURE_ENDPOINT"),
23
- "o3-mini_deployment": self.get_key("AZURE_O3_MINI_DEPLOYMENT", required=False),
24
- "gpt-4_1_deployment": self.get_key("AZURE_GPT_4_1_DEPLOYMENT", required=False),
25
- "gpt-4o_deployment": self.get_key("AZURE_GPT_4O_DEPLOYMENT", required=False),
26
- }
27
-
28
18
  def get_default_model(self) -> LLMModel:
29
19
  return ModelRegistry.from_name(self.get_key("DEFAULT_MODEL"))
30
20
 
@@ -46,8 +36,16 @@ class EnvConfig:
46
36
  def get_prompt_loader_mode(self) -> PromptLoaderMode:
47
37
  return PromptLoaderMode.from_name(self.get_key("PROMPT_LOADER_MODE", "local"))
48
38
 
49
- def get_trace_sink_mode(self) -> TraceSinkMode:
50
- return TraceSinkMode.from_name(self.get_key("TRACE_SINK_MODE", "local"))
39
+ def get_trace_sink_mode(self) -> OptionalType[TraceSinkMode]:
40
+ """Get the trace sink mode from environment variable.
41
+
42
+ Returns:
43
+ TraceSinkMode.LOCAL if TRACE_SINK_MODE=local,
44
+ TraceSinkMode.NOOP if TRACE_SINK_MODE=noop,
45
+ None if TRACE_SINK_MODE is not set or empty (allows global/default behavior).
46
+ """
47
+ mode_str = self.get_key("TRACE_SINK_MODE", "", required=False)
48
+ return TraceSinkMode.from_name(mode_str)
51
49
 
52
50
  def get_credentials_provider_type(self) -> str:
53
51
  return self.get_key("CREDENTIALS_PROVIDER_TYPE", "env")
@@ -22,6 +22,11 @@ class GoogleModelFactory(BaseModelFactory):
22
22
  if config.reasoning:
23
23
  model_config["thinking_budget"] = config.reasoning_budget_tokens
24
24
  model_config["include_thoughts"] = True
25
+ else:
26
+ # Gemini models have thinking enabled by default, so we must explicitly
27
+ # set thinking_budget=0 to disable it (omitting the parameter doesn't work)
28
+ model_config["thinking_budget"] = 0
29
+ model_config["include_thoughts"] = False
25
30
 
26
31
  # Handle streaming - Google models use disable_streaming instead of streaming
27
32
  if not config.streaming:
@@ -36,15 +36,21 @@ class OpenAIModelFactory(BaseModelFactory):
36
36
  if config.tool_usage:
37
37
  model_config["model_kwargs"] = {"parallel_tool_calls": True}
38
38
 
39
- # Add model-specific configurations for reasoning models
39
+ # Handle reasoning configuration based on user preference (config.reasoning)
40
+ # and model capability (config.model.reasoning)
40
41
  if config.model.reasoning:
41
- # Enable Responses API for reasoning models
42
+ # Model supports reasoning - check user preference
42
43
  model_config["use_responses_api"] = True
43
44
 
44
- # Configure reasoning through model_kwargs as per LangChain docs
45
- if config.reasoning_summary:
46
- model_config["model_kwargs"] = {"reasoning": {"effort": config.reasoning_effort, "summary": config.reasoning_summary}}
45
+ if config.reasoning:
46
+ # User wants reasoning enabled - use configured effort
47
+ if config.reasoning_summary:
48
+ model_config["model_kwargs"] = {"reasoning": {"effort": config.reasoning_effort, "summary": config.reasoning_summary}}
49
+ else:
50
+ # User wants reasoning disabled - use model's minimum effort level
51
+ model_config["model_kwargs"] = {"reasoning": {"effort": config.model.reasoning_min_effort}}
47
52
  else:
53
+ # Model doesn't support reasoning
48
54
  model_config["temperature"] = config.temperature
49
55
 
50
56
  return model_config
@@ -8,6 +8,7 @@ class LLMModel:
8
8
  family: str
9
9
  name: str
10
10
  reasoning: bool = True
11
+ reasoning_min_effort: str = "none" # Minimum reasoning effort: 'none' or 'minimal'
11
12
  prompt_caching: bool = False
12
13
 
13
14
  def __str__(self) -> str:
@@ -25,9 +25,9 @@ class ModelRegistry:
25
25
  GPT_4O = LLMModel(family=LLMFamilies.OPENAI, name="gpt-4o", reasoning=False, prompt_caching=True)
26
26
  O4_MINI = LLMModel(family=LLMFamilies.OPENAI, name="o4-mini")
27
27
  O4_MINI_APRIL_2025 = LLMModel(family=LLMFamilies.OPENAI, name="o4-mini-2025-04-16")
28
- GPT_5 = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5", reasoning=True, prompt_caching=True)
29
- GPT_5_MINI = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5-mini", reasoning=True, prompt_caching=True)
30
- GPT_5_NANO = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5-nano", reasoning=True, prompt_caching=True)
28
+ GPT_5 = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5", reasoning=True, reasoning_min_effort="minimal", prompt_caching=True)
29
+ GPT_5_MINI = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5-mini", reasoning=True, reasoning_min_effort="minimal", prompt_caching=True)
30
+ GPT_5_NANO = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5-nano", reasoning=True, reasoning_min_effort="minimal", prompt_caching=True)
31
31
  GPT_5_1 = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5.1", reasoning=True, prompt_caching=True)
32
32
  GPT_5_1_CODEX = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5.1-codex", reasoning=True, prompt_caching=True)
33
33
  GPT_5_1_CODEX_MINI = LLMModel(family=LLMFamilies.OPENAI, name="gpt-5.1-codex-mini", reasoning=True, prompt_caching=True)
@@ -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"
@@ -1,6 +1,7 @@
1
1
  from spaik_sdk.tracing.agent_trace import AgentTrace
2
- from spaik_sdk.tracing.get_trace_sink import get_trace_sink
2
+ from spaik_sdk.tracing.get_trace_sink import configure_tracing, get_trace_sink
3
3
  from spaik_sdk.tracing.local_trace_sink import LocalTraceSink
4
+ from spaik_sdk.tracing.noop_trace_sink import NoOpTraceSink
4
5
  from spaik_sdk.tracing.trace_sink import TraceSink
5
6
  from spaik_sdk.tracing.trace_sink_mode import TraceSinkMode
6
7
 
@@ -8,6 +9,8 @@ __all__ = [
8
9
  "AgentTrace",
9
10
  "TraceSink",
10
11
  "LocalTraceSink",
12
+ "NoOpTraceSink",
11
13
  "TraceSinkMode",
14
+ "configure_tracing",
12
15
  "get_trace_sink",
13
16
  ]
@@ -1,5 +1,6 @@
1
1
  import json
2
2
  import time
3
+ import uuid
3
4
  from typing import Optional, Type
4
5
 
5
6
  from pydantic import BaseModel
@@ -15,12 +16,15 @@ class AgentTrace:
15
16
  system_prompt: str,
16
17
  save_name: Optional[str] = None,
17
18
  trace_sink: Optional[TraceSink] = None,
19
+ agent_instance_id: Optional[str] = None,
18
20
  ):
19
21
  self.system_prompt: str = system_prompt
20
22
  self._start_time_monotonic: float = time.monotonic()
21
23
  self._steps: list[tuple[float, str]] = []
22
24
  self.save_name: Optional[str] = save_name
23
25
  self._trace_sink: TraceSink = trace_sink or get_trace_sink()
26
+ # Generate UUID if not provided (backward compatibility)
27
+ self.agent_instance_id: str = agent_instance_id or str(uuid.uuid4())
24
28
 
25
29
  def add_step(self, step_content: str) -> None:
26
30
  current_time_monotonic: float = time.monotonic()
@@ -69,4 +73,4 @@ class AgentTrace:
69
73
 
70
74
  def save(self, name: str) -> None:
71
75
  trace_content = self.to_string(include_system_prompt=False)
72
- self._trace_sink.save_trace(name, trace_content, self.system_prompt)
76
+ self._trace_sink.save_trace(name, trace_content, self.system_prompt, self.agent_instance_id)
@@ -1,15 +1,77 @@
1
1
  from typing import Optional
2
2
 
3
3
  from spaik_sdk.tracing.local_trace_sink import LocalTraceSink
4
+ from spaik_sdk.tracing.noop_trace_sink import NoOpTraceSink
4
5
  from spaik_sdk.tracing.trace_sink import TraceSink
5
6
  from spaik_sdk.tracing.trace_sink_mode import TraceSinkMode
6
7
 
8
+ # Module-level storage for globally configured trace sink
9
+ _global_trace_sink: Optional[TraceSink] = None
10
+
11
+
12
+ def configure_tracing(sink: Optional[TraceSink]) -> None:
13
+ """Configure the global trace sink used by all agents.
14
+
15
+ Call this once at application startup to set a custom trace sink
16
+ that will be used by all subsequently created agents.
17
+
18
+ Resolution order:
19
+ 1. TRACE_SINK_MODE=local env var -> LocalTraceSink (escape hatch)
20
+ 2. TRACE_SINK_MODE=noop env var -> NoOpTraceSink
21
+ 3. Global sink set via this function -> the configured sink
22
+ 4. No configuration -> NoOpTraceSink (silent default)
23
+
24
+ Args:
25
+ sink: The TraceSink to use globally, or None to clear the global
26
+ configuration (reverts to default no-op behavior).
27
+
28
+ Example:
29
+ from spaik_sdk.tracing import configure_tracing, LocalTraceSink
30
+
31
+ # At application startup
32
+ configure_tracing(LocalTraceSink(traces_dir="my_traces"))
33
+
34
+ # Or with a custom sink for observability
35
+ configure_tracing(MyDatadogTraceSink())
36
+
37
+ # Clear global config
38
+ configure_tracing(None)
39
+ """
40
+ global _global_trace_sink
41
+ _global_trace_sink = sink
42
+
7
43
 
8
44
  def get_trace_sink(mode: Optional[TraceSinkMode] = None) -> TraceSink:
45
+ """Get the appropriate trace sink based on configuration.
46
+
47
+ Resolution order:
48
+ 1. If mode parameter is provided, use that mode
49
+ 2. Check TRACE_SINK_MODE env var (LOCAL or NOOP override everything)
50
+ 3. Check for globally configured sink via configure_tracing()
51
+ 4. Default to NoOpTraceSink (silent no-op)
52
+
53
+ Args:
54
+ mode: Optional explicit mode to use (overrides all other config).
55
+
56
+ Returns:
57
+ The appropriate TraceSink instance.
58
+ """
9
59
  # Lazy import to avoid circular dependency with env.py
10
60
  from spaik_sdk.config.env import env_config
11
61
 
12
- mode = mode or env_config.get_trace_sink_mode()
62
+ # If explicit mode parameter provided, use it
63
+ if mode is None:
64
+ mode = env_config.get_trace_sink_mode()
65
+
66
+ # Step 1-2: Check env var mode (LOCAL or NOOP)
13
67
  if mode == TraceSinkMode.LOCAL:
14
68
  return LocalTraceSink()
15
- raise ValueError(f"Unknown TraceSinkMode: {mode}")
69
+ if mode == TraceSinkMode.NOOP:
70
+ return NoOpTraceSink()
71
+
72
+ # Step 3: Check global sink
73
+ if _global_trace_sink is not None:
74
+ return _global_trace_sink
75
+
76
+ # Step 4: Default to no-op
77
+ return NoOpTraceSink()
@@ -10,7 +10,14 @@ class LocalTraceSink(TraceSink):
10
10
  def __init__(self, traces_dir: Optional[str] = None):
11
11
  self.traces_dir = traces_dir or "traces"
12
12
 
13
- def save_trace(self, name: str, trace_content: str, system_prompt: str) -> None:
13
+ def save_trace(
14
+ self,
15
+ name: str,
16
+ trace_content: str,
17
+ system_prompt: str,
18
+ agent_instance_id: Optional[str] = None,
19
+ ) -> None:
20
+ # agent_instance_id is accepted but intentionally ignored - file naming is unchanged
14
21
  os.makedirs(self.traces_dir, exist_ok=True)
15
22
 
16
23
  trace_path = os.path.join(self.traces_dir, f"{name}.txt")
@@ -0,0 +1,21 @@
1
+ from typing import Optional
2
+
3
+ from spaik_sdk.tracing.trace_sink import TraceSink
4
+
5
+
6
+ class NoOpTraceSink(TraceSink):
7
+ """TraceSink implementation that does nothing.
8
+
9
+ Used as the default when no tracing is configured, ensuring traces
10
+ are silently discarded without any side effects.
11
+ """
12
+
13
+ def save_trace(
14
+ self,
15
+ name: str,
16
+ trace_content: str,
17
+ system_prompt: str,
18
+ agent_instance_id: Optional[str] = None,
19
+ ) -> None:
20
+ """Do nothing - silently discard the trace."""
21
+ pass
@@ -1,4 +1,5 @@
1
1
  from abc import ABC, abstractmethod
2
+ from typing import Optional
2
3
 
3
4
 
4
5
  class TraceSink(ABC):
@@ -8,12 +9,21 @@ class TraceSink(ABC):
8
9
  """
9
10
 
10
11
  @abstractmethod
11
- def save_trace(self, name: str, trace_content: str, system_prompt: str) -> None:
12
+ def save_trace(
13
+ self,
14
+ name: str,
15
+ trace_content: str,
16
+ system_prompt: str,
17
+ agent_instance_id: Optional[str] = None,
18
+ ) -> None:
12
19
  """Save a trace with its system prompt.
13
20
 
14
21
  Args:
15
22
  name: Identifier for the trace (e.g., agent class name)
16
23
  trace_content: The formatted trace content (without system prompt)
17
24
  system_prompt: The system prompt used for the agent
25
+ agent_instance_id: Optional UUID identifying the agent instance for correlation.
26
+ Custom sinks can use this to correlate traces in observability
27
+ backends (e.g., Datadog, OpenTelemetry).
18
28
  """
19
29
  pass
@@ -1,14 +1,28 @@
1
1
  from enum import Enum
2
+ from typing import Optional
2
3
 
3
4
 
4
5
  class TraceSinkMode(Enum):
5
6
  LOCAL = "local"
7
+ NOOP = "noop"
6
8
 
7
9
  @classmethod
8
- def from_name(cls, name: str) -> "TraceSinkMode":
10
+ def from_name(cls, name: Optional[str]) -> Optional["TraceSinkMode"]:
11
+ """Convert a string name to a TraceSinkMode.
12
+
13
+ Args:
14
+ name: The mode name ("local", "noop") or None/empty string.
15
+
16
+ Returns:
17
+ The corresponding TraceSinkMode, or None if name is empty/None.
18
+ Returns None for unrecognized values (silent fallthrough to default behavior).
19
+ """
20
+ if not name:
21
+ return None
22
+
9
23
  for mode in cls:
10
- if mode.value == name:
24
+ if mode.value == name.lower():
11
25
  return mode
12
26
 
13
- available_modes = [mode.value for mode in cls]
14
- raise ValueError(f"Unknown TraceSinkMode '{name}'. Available: {', '.join(available_modes)}")
27
+ # Unknown values fall through to None (let get_trace_sink handle default)
28
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaik-sdk
3
- Version: 0.6.3
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=5X1b2Z7LjxF-y5XVxZCsURXMztCR14zsj2fPvu0bdB0,10808
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=vidp6zmJ_Xy2brmxkGQFeoDmkGKr_6h3jBO9x9Ydb1o,2361
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
@@ -55,18 +55,18 @@ spaik_sdk/llm/streaming/streaming_state_manager.py,sha256=Nsfcf9umUk2WAVdsank3a_
55
55
  spaik_sdk/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  spaik_sdk/models/llm_config.py,sha256=ICIY_y_-loD7X0h-0_sjJUufxPpZgrUKfEQ5uVxA740,1641
57
57
  spaik_sdk/models/llm_families.py,sha256=mtsMfih5FbkX52eFMkMSfjiSIpkroZ_uqe8JlreJscQ,169
58
- spaik_sdk/models/llm_model.py,sha256=8cUyfRyguinno-GdVqvSlf9J6aylEgjoYiCRV56JdzM,352
58
+ spaik_sdk/models/llm_model.py,sha256=DO8wlN4Gj_AB_lxTpqzQGDABvDgyOI3JcQda_J-UiKU,440
59
59
  spaik_sdk/models/llm_wrapper.py,sha256=CB07qSPJUWScN3hj1SO_9qi8QQ7Zg5p53JLnXFZ4O6A,929
60
- spaik_sdk/models/model_registry.py,sha256=CxucIOjp9Pf8gRnp5jOSKZMpyxx8P1s2io2qdTJi5k8,7818
60
+ spaik_sdk/models/model_registry.py,sha256=bzMi-_amifpuE-YNkK2lAPDYOiAPX0Unz2xNzhATEQM,7914
61
61
  spaik_sdk/models/factories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  spaik_sdk/models/factories/anthropic_factory.py,sha256=1Dmn-RBTmDHnXVCt2D3xx1Xw9OVMaecTk1kBFur8prs,1330
63
63
  spaik_sdk/models/factories/base_model_factory.py,sha256=iLTUhVh7G4l9TiQdFlq9HU-cs-t5uaul4SeoIdSFNww,2845
64
- spaik_sdk/models/factories/google_factory.py,sha256=2HpsTqrNy-xfk9d1lLU62YxTBjZyZYxWVg-N9ViAPu4,1199
64
+ spaik_sdk/models/factories/google_factory.py,sha256=5Xc-I6h_SwPJFaSVu0m87O2xcRgWns0OwURK_hFUpbg,1486
65
65
  spaik_sdk/models/factories/ollama_factory.py,sha256=7RXPlbF7b-wJA45FluSGkVIzMXdHToxxGQ99KatiLfs,1674
66
- spaik_sdk/models/factories/openai_factory.py,sha256=kdHnVbpvJ2g2sTqVFbSQzqPKNlbXR_rLTz2Dwv8z0h8,2116
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
@@ -148,14 +148,15 @@ spaik_sdk/tools/tool_provider.py,sha256=m34O2Yw-k40NDCxU8OzBR9AZz4cnM439KKYo62l2
148
148
  spaik_sdk/tools/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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
- spaik_sdk/tracing/__init__.py,sha256=il8zLt8OCPOk15O9TIDbHDspMUfQ41Tc_rJyHk3yefI,401
152
- spaik_sdk/tracing/agent_trace.py,sha256=074iqitiYuq71-hPWUZ42KIJlg1ss0_eCEWmUuZmHjY,2790
153
- spaik_sdk/tracing/get_trace_sink.py,sha256=O_CrRutRaJ-hOPx5oQI1O7ROGkqCh0Xzu77hejuQUiQ,558
154
- spaik_sdk/tracing/local_trace_sink.py,sha256=4Z3Txo_VOj69OvREILxeiKpLBjd_0l-Mk6ut4kS5GyE,803
155
- spaik_sdk/tracing/trace_sink.py,sha256=J_jl53G84PJhtbhwYIfJZX-ikC2o4xxM7svgH0RWu6E,611
156
- spaik_sdk/tracing/trace_sink_mode.py,sha256=e2hRBrerRugdzjfRTtIDWMqbSygCRAo5TExFX4OLrJg,388
151
+ spaik_sdk/tracing/__init__.py,sha256=kmLFmy1Lb7bS2sryIFoFaknxYXlyuswuP_4gHmwEtv0,526
152
+ spaik_sdk/tracing/agent_trace.py,sha256=9G2WHQOiVL_HOnlD8Qz2DHtd1Trldqg4jqcFDPGPf_w,3017
153
+ spaik_sdk/tracing/get_trace_sink.py,sha256=ZPg8pVLS1BbY0PwXJXC-O8qSvUvQSzmDb4SWRtsRSSc,2573
154
+ spaik_sdk/tracing/local_trace_sink.py,sha256=QTqkzDv8S0cLtRvScwPmejnj6EpccYaHFjd7KkP9Xrk,984
155
+ spaik_sdk/tracing/noop_trace_sink.py,sha256=AxImIYh8MPzISTp6qDp8ShtWyPLVqLRwsh7yyAVDSjs,540
156
+ spaik_sdk/tracing/trace_sink.py,sha256=LU6aF848Kz2hMZuz0q6l-4IaD0sC-ex0AKFk8mVTSR4,984
157
+ spaik_sdk/tracing/trace_sink_mode.py,sha256=74qiL4P3sNVGM3_DUkWKlqlu9UvT928NLKTskD_vxgk,791
157
158
  spaik_sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
159
  spaik_sdk/utils/init_logger.py,sha256=htxNtHMxRXVNAXBbS9f6Wmd0aET7kl3ClJ062b3YHmQ,791
159
- spaik_sdk-0.6.3.dist-info/METADATA,sha256=Tk13mI3ycVi-ECgyDUMxk4uoBhuSPEakShRf2EQcnjo,10085
160
- spaik_sdk-0.6.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
161
- spaik_sdk-0.6.3.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,,