glaip-sdk 0.7.9__py3-none-any.whl → 0.7.10__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.
@@ -172,6 +172,63 @@ class AgentRunRenderingManager:
172
172
  finished_monotonic = monotonic()
173
173
  return final_text, stats_usage, started_monotonic, finished_monotonic
174
174
 
175
+ async def _consume_event_stream(
176
+ self,
177
+ event_stream: AsyncIterable[dict[str, Any]],
178
+ renderer: RichStreamRenderer,
179
+ final_text: str,
180
+ stats_usage: dict[str, Any],
181
+ meta: dict[str, Any],
182
+ skip_final_render: bool,
183
+ last_rendered_content: str | None,
184
+ controller: Any | None,
185
+ ) -> tuple[str, dict[str, Any], float | None]:
186
+ """Consume event stream and update state.
187
+
188
+ Args:
189
+ event_stream: Async iterable yielding SSE-like event dicts.
190
+ renderer: Renderer to use for displaying events.
191
+ final_text: Current accumulated final text.
192
+ stats_usage: Usage statistics dictionary.
193
+ meta: Metadata dictionary.
194
+ skip_final_render: If True, skip rendering final_response events.
195
+ last_rendered_content: Last rendered content to avoid duplicates.
196
+ controller: Controller instance.
197
+
198
+ Returns:
199
+ Tuple of (final_text, stats_usage, started_monotonic).
200
+ """
201
+ started_monotonic: float | None = None
202
+
203
+ async for event in event_stream:
204
+ if started_monotonic is None:
205
+ started_monotonic = monotonic()
206
+
207
+ parsed_event = self._parse_event(event)
208
+ if parsed_event is None:
209
+ continue
210
+
211
+ final_text, stats_usage = self._handle_parsed_event(
212
+ parsed_event,
213
+ renderer,
214
+ final_text,
215
+ stats_usage,
216
+ meta,
217
+ skip_final_render=skip_final_render,
218
+ last_rendered_content=last_rendered_content,
219
+ )
220
+
221
+ content_str = self._extract_content_string(parsed_event)
222
+ if content_str:
223
+ last_rendered_content = content_str
224
+
225
+ if controller and getattr(controller, "enabled", False):
226
+ controller.poll(renderer)
227
+ if parsed_event and self._is_final_event(parsed_event):
228
+ break
229
+
230
+ return final_text, stats_usage, started_monotonic
231
+
175
232
  async def async_process_stream_events(
176
233
  self,
177
234
  event_stream: AsyncIterable[dict[str, Any]],
@@ -207,35 +264,25 @@ class AgentRunRenderingManager:
207
264
  controller.on_stream_start(renderer)
208
265
 
209
266
  try:
210
- async for event in event_stream:
211
- if started_monotonic is None:
212
- started_monotonic = monotonic()
213
-
214
- # Parse event if needed (handles both raw SSE and pre-parsed dicts)
215
- parsed_event = self._parse_event(event)
216
- if parsed_event is None:
217
- continue
218
-
219
- # Process the event and update accumulators
220
- final_text, stats_usage = self._handle_parsed_event(
221
- parsed_event,
222
- renderer,
223
- final_text,
224
- stats_usage,
225
- meta,
226
- skip_final_render=skip_final_render,
227
- last_rendered_content=last_rendered_content,
228
- )
229
-
230
- # Track last rendered content to avoid duplicates
231
- content_str = self._extract_content_string(parsed_event)
232
- if content_str:
233
- last_rendered_content = content_str
234
-
235
- if controller and getattr(controller, "enabled", False):
236
- controller.poll(renderer)
237
- if parsed_event and self._is_final_event(parsed_event):
238
- break
267
+ final_text, stats_usage, started_monotonic = await self._consume_event_stream(
268
+ event_stream,
269
+ renderer,
270
+ final_text,
271
+ stats_usage,
272
+ meta,
273
+ skip_final_render,
274
+ last_rendered_content,
275
+ controller,
276
+ )
277
+ except Exception as e:
278
+ err_msg = str(e)
279
+ reason = getattr(getattr(e, "result", None), "reason", None)
280
+ if reason:
281
+ final_text = f"⚠️ Guardrail violation: {reason}"
282
+ elif "⚠️ Guardrail violation" in err_msg or "Content blocked by guardrails" in err_msg:
283
+ final_text = err_msg
284
+ else:
285
+ raise e
239
286
  finally:
240
287
  if controller and getattr(controller, "enabled", False):
241
288
  controller.on_stream_complete()
@@ -0,0 +1,80 @@
1
+ """Guardrails package for content filtering and safety checks.
2
+
3
+ This package provides modular guardrail engines and managers for filtering
4
+ harmful content in AI agent interactions. All components support lazy loading
5
+ from aip-agents to maintain Principle VII compliance.
6
+
7
+ Authors:
8
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
9
+ """
10
+
11
+ from enum import StrEnum
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ if TYPE_CHECKING:
15
+ from aip_agents.guardrails.engines.nemo import NemoGuardrailEngine
16
+ from aip_agents.guardrails.engines.phrase_matcher import PhraseMatcherEngine
17
+ from aip_agents.guardrails.manager import GuardrailManager
18
+ from aip_agents.guardrails.schemas import GuardrailMode
19
+
20
+
21
+ class ImportableName(StrEnum):
22
+ """Names of the importable attributes."""
23
+
24
+ GUARDRAIL_MANAGER = "GuardrailManager"
25
+ PHRASE_MATCHER_ENGINE = "PhraseMatcherEngine"
26
+ NEMO_GUARDRAIL_ENGINE = "NemoGuardrailEngine"
27
+ GUARDRAIL_MODE = "GuardrailMode"
28
+
29
+
30
+ # Lazy loading support - components are only imported when actually used
31
+ _LAZY_IMPORTS = {}
32
+
33
+
34
+ def __getattr__(name: str) -> Any:
35
+ """Lazy import to avoid eager loading of optional aip-agents dependency.
36
+
37
+ This function is called by Python when an attribute is not found in the module.
38
+ It performs the import from aip_agents.guardrails at runtime.
39
+
40
+ Args:
41
+ name: The name of the attribute to get.
42
+
43
+ Returns:
44
+ The attribute value from aip_agents.
45
+
46
+ Raises:
47
+ AttributeError: If the attribute doesn't exist.
48
+ ImportError: If aip-agents is not installed but a component is accessed.
49
+ """
50
+ if name in _LAZY_IMPORTS:
51
+ return _LAZY_IMPORTS[name]
52
+
53
+ if name == ImportableName.GUARDRAIL_MANAGER:
54
+ from aip_agents.guardrails.manager import GuardrailManager # noqa: PLC0415
55
+
56
+ _LAZY_IMPORTS[name] = GuardrailManager
57
+ return GuardrailManager
58
+
59
+ if name == ImportableName.PHRASE_MATCHER_ENGINE:
60
+ from aip_agents.guardrails.engines.phrase_matcher import ( # noqa: PLC0415
61
+ PhraseMatcherEngine,
62
+ )
63
+
64
+ _LAZY_IMPORTS[name] = PhraseMatcherEngine
65
+ return PhraseMatcherEngine
66
+
67
+ if name == ImportableName.NEMO_GUARDRAIL_ENGINE:
68
+ from aip_agents.guardrails.engines.nemo import NemoGuardrailEngine # noqa: PLC0415
69
+
70
+ _LAZY_IMPORTS[name] = NemoGuardrailEngine
71
+ return NemoGuardrailEngine
72
+
73
+ if name == ImportableName.GUARDRAIL_MODE:
74
+ from aip_agents.guardrails.schemas import GuardrailMode # noqa: PLC0415
75
+
76
+ _LAZY_IMPORTS[name] = GuardrailMode
77
+ return GuardrailMode
78
+
79
+ msg = f"module {__name__!r} has no attribute {name!r}"
80
+ raise AttributeError(msg)
@@ -0,0 +1,89 @@
1
+ """Guardrail serialization logic.
2
+
3
+ This module provides functionality to serialize GuardrailManager and its engines
4
+ into the JSON format expected by the GL AIP backend. This keeps the serialization
5
+ logic within the SDK rather than polluting the core aip-agents logic.
6
+
7
+ Authors:
8
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from typing import TYPE_CHECKING, Any
14
+
15
+ if TYPE_CHECKING:
16
+ from glaip_sdk.guardrails import (
17
+ GuardrailManager,
18
+ NemoGuardrailEngine,
19
+ PhraseMatcherEngine,
20
+ )
21
+
22
+
23
+ def _serialize_phrase_matcher(engine: PhraseMatcherEngine) -> dict[str, Any]:
24
+ """Serialize a PhraseMatcherEngine configuration."""
25
+ config: dict[str, Any] = {}
26
+
27
+ # Extract config from BaseGuardrailEngineConfig
28
+ if hasattr(engine, "config") and engine.config:
29
+ config.update(engine.config.model_dump())
30
+
31
+ # Extract specific fields
32
+ if hasattr(engine, "banned_phrases"):
33
+ config["banned_phrases"] = engine.banned_phrases
34
+
35
+ return config
36
+
37
+
38
+ def _serialize_nemo(engine: NemoGuardrailEngine) -> dict[str, Any]:
39
+ """Serialize a NemoGuardrailEngine configuration."""
40
+ config: dict[str, Any] = {}
41
+
42
+ # Extract config from BaseGuardrailEngineConfig
43
+ if hasattr(engine, "config") and engine.config:
44
+ config.update(engine.config.model_dump())
45
+
46
+ # Extract specific fields
47
+ nemo_fields = [
48
+ "topic_safety_mode",
49
+ "allowed_topics",
50
+ "denied_topics",
51
+ "include_core_restrictions",
52
+ "core_restriction_categories",
53
+ "config_dict",
54
+ "denial_phrases",
55
+ ]
56
+ for field in nemo_fields:
57
+ if hasattr(engine, field):
58
+ val = getattr(engine, field)
59
+ if val is not None:
60
+ config[field] = val
61
+
62
+ return config
63
+
64
+
65
+ def serialize_guardrail_manager(manager: GuardrailManager) -> dict[str, Any]:
66
+ """Serialize a GuardrailManager into the backend JSON format.
67
+
68
+ Args:
69
+ manager: The GuardrailManager instance to serialize.
70
+
71
+ Returns:
72
+ A dictionary matching the agent_config.guardrails schema.
73
+ """
74
+ from glaip_sdk.guardrails import NemoGuardrailEngine, PhraseMatcherEngine # noqa: PLC0415
75
+
76
+ engines_config = []
77
+
78
+ if hasattr(manager, "engines"):
79
+ for engine in manager.engines:
80
+ if isinstance(engine, PhraseMatcherEngine):
81
+ engines_config.append({"type": "phrase_matcher", "config": _serialize_phrase_matcher(engine)})
82
+ elif isinstance(engine, NemoGuardrailEngine):
83
+ engines_config.append({"type": "nemo", "config": _serialize_nemo(engine)})
84
+ else:
85
+ # Fallback for unknown engines
86
+ continue
87
+
88
+ enabled = getattr(manager, "enabled", True)
89
+ return {"enabled": enabled, "engines": engines_config}
@@ -57,6 +57,7 @@ AGENT_FIELD_RULES: Mapping[str, FieldRule] = {
57
57
  "timeout": FieldRule(cli_managed_create=True, cli_managed_update=True),
58
58
  # Fields requiring sanitisation before sending to the API
59
59
  "agent_config": FieldRule(requires_sanitization=True),
60
+ "guardrail": FieldRule(requires_sanitization=True),
60
61
  }
61
62
 
62
63
 
@@ -0,0 +1,34 @@
1
+ """Guardrail payload schemas for API communication.
2
+
3
+ Authors:
4
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
5
+ """
6
+
7
+ from collections.abc import Mapping, Sequence
8
+ from typing import Any
9
+
10
+ from pydantic import BaseModel, Field
11
+
12
+
13
+ class GuardrailEnginePayload(BaseModel):
14
+ """Payload schema for a single guardrail engine configuration.
15
+
16
+ This model defines the structure for individual safety engines (e.g., phrase_matcher, nemo)
17
+ when communicating with the GL AIP backend.
18
+ """
19
+
20
+ type: str = Field(..., description="The type of guardrail engine (e.g., 'phrase_matcher', 'nemo')")
21
+ config: Mapping[str, Any] = Field(..., description="Engine-specific configuration parameters")
22
+
23
+
24
+ class GuardrailPayload(BaseModel):
25
+ """Payload schema for global guardrail settings.
26
+
27
+ This model acts as the container for all guardrail configurations within the agent_config.
28
+ """
29
+
30
+ enabled: bool = Field(default=True, description="Global toggle to enable or disable all guardrails")
31
+ engines: Sequence[GuardrailEnginePayload] = Field(
32
+ default_factory=list,
33
+ description="List of configured guardrail engines",
34
+ )
@@ -387,6 +387,7 @@ class LangGraphRunner(BaseRunner):
387
387
  agents=sub_agent_instances if sub_agent_instances else None,
388
388
  tool_configs=tool_configs if tool_configs else None,
389
389
  tool_output_manager=tool_output_manager,
390
+ guardrail=agent.guardrail,
390
391
  **agent_config_params,
391
392
  **agent_config_kwargs,
392
393
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: glaip-sdk
3
- Version: 0.7.9
3
+ Version: 0.7.10
4
4
  Summary: Python SDK and CLI for GL AIP (GDP Labs AI Agent Package) - Build, run, and manage AI agents
5
5
  Author-email: Raymond Christopher <raymond.christopher@gdplabs.id>
6
6
  License: MIT
@@ -25,6 +25,8 @@ Provides-Extra: memory
25
25
  Requires-Dist: aip-agents-binary[memory]>=0.5.23; (python_version >= "3.11" and python_version < "3.13") and extra == "memory"
26
26
  Provides-Extra: privacy
27
27
  Requires-Dist: aip-agents-binary[privacy]>=0.5.23; (python_version >= "3.11" and python_version < "3.13") and extra == "privacy"
28
+ Provides-Extra: guardrails
29
+ Requires-Dist: aip-agents-binary[guardrails]>=0.5.23; (python_version >= "3.11" and python_version < "3.13") and extra == "guardrails"
28
30
  Provides-Extra: dev
29
31
  Requires-Dist: pytest>=7.0.0; extra == "dev"
30
32
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
@@ -5,7 +5,7 @@ glaip_sdk/exceptions.py,sha256=iAChFClkytXRBLP0vZq1_YjoZxA9i4m4bW1gDLiGR1g,2321
5
5
  glaip_sdk/icons.py,sha256=J5THz0ReAmDwIiIooh1_G3Le-mwTJyEjhJDdJ13KRxM,524
6
6
  glaip_sdk/rich_components.py,sha256=44Z0V1ZQleVh9gUDGwRR5mriiYFnVGOhm7fFxZYbP8c,4052
7
7
  glaip_sdk/agents/__init__.py,sha256=VfYov56edbWuySXFEbWJ_jLXgwnFzPk1KB-9-mfsUCc,776
8
- glaip_sdk/agents/base.py,sha256=GQnzCw2cqlrbxwdoWFfhBcBlEDgubY4tlD6gr1b3zps,44539
8
+ glaip_sdk/agents/base.py,sha256=6528sEC2RGwOn0sWqiKiqf5Y_uHEuleN0nT42XlaC0U,46317
9
9
  glaip_sdk/cli/__init__.py,sha256=xCCfuF1Yc7mpCDcfhHZTX0vizvtrDSLeT8MJ3V7m5A0,156
10
10
  glaip_sdk/cli/account_store.py,sha256=u_memecwEQssustZs2wYBrHbEmKUlDfmmL-zO1F3n3A,19034
11
11
  glaip_sdk/cli/agent_config.py,sha256=YAbFKrTNTRqNA6b0i0Q3pH-01rhHDRi5v8dxSFwGSwM,2401
@@ -77,19 +77,19 @@ glaip_sdk/cli/slash/accounts_controller.py,sha256=SceJlc2F2ZdlSDkuWO3Js3akL89bVt
77
77
  glaip_sdk/cli/slash/accounts_shared.py,sha256=Mq5HxlI0YsVEQ0KKISWvyBZhzOFFWCzwRbhF5xwvUbM,2626
78
78
  glaip_sdk/cli/slash/agent_session.py,sha256=tuVOme-NbEyr6rwJvsBEKZYWQmsaRf4piJeRvIGu0ns,11384
79
79
  glaip_sdk/cli/slash/prompt.py,sha256=q4f1c2zr7ZMUeO6AgOBF2Nz4qgMOXrVPt6WzPRQMbAM,8501
80
- glaip_sdk/cli/slash/remote_runs_controller.py,sha256=a5X5rYgb9l6dHhvTewRUCj-hAo7mKRnuM_MwGvxs8jI,21363
80
+ glaip_sdk/cli/slash/remote_runs_controller.py,sha256=iLl4a-mu9QU7dcedgEILewPtDIVtFUJkbKGtcx1F66U,21445
81
81
  glaip_sdk/cli/slash/session.py,sha256=Zn2hXND_Tfameh_PI8g4VIMd7GPWxwhtPNMN9p6cF7M,65081
82
82
  glaip_sdk/cli/slash/tui/__init__.py,sha256=oBUzeoslYwPKVlhqhgg4I7480b77vQNc9ec0NgdTC1s,977
83
- glaip_sdk/cli/slash/tui/accounts.tcss,sha256=BCjIuTetmVjydv6DCliY38Cze2LUEu7IY44sL5nIuLU,1194
84
- glaip_sdk/cli/slash/tui/accounts_app.py,sha256=pQYQz9ljPn4WcXEmyhMk3Lt1h_ZgrMvlYplxN3lbcy4,42411
83
+ glaip_sdk/cli/slash/tui/accounts.tcss,sha256=w_9w2dXxjopMed-3_SWZ3KJiOYNa8hReW6DEKRprcic,1344
84
+ glaip_sdk/cli/slash/tui/accounts_app.py,sha256=hYpxOTG3zwS_t41WaCv9K-fPYL6b380EeAUCjNUtbJo,43520
85
85
  glaip_sdk/cli/slash/tui/background_tasks.py,sha256=SAe1mV2vXB3mJcSGhelU950vf8Lifjhws9iomyIVFKw,2422
86
- glaip_sdk/cli/slash/tui/clipboard.py,sha256=HL_RWIdONyRmDtTYuDzxJTS_mRcLxuR37Ac9Ug5nh40,4730
86
+ glaip_sdk/cli/slash/tui/clipboard.py,sha256=7fEshhTwHYaj-n7n0W0AsWTs8W0RLZw_9luXxrFTrtw,6227
87
87
  glaip_sdk/cli/slash/tui/context.py,sha256=XgHsXPl8LDDwIueP_jhP6xqpx_zHOk0FF19rWob_z5Q,3128
88
88
  glaip_sdk/cli/slash/tui/keybind_registry.py,sha256=_rK05BxTxNudYc4iJ9gDxpgeUkjDAq8rarIT-9A-jyM,6739
89
89
  glaip_sdk/cli/slash/tui/loading.py,sha256=nW5pv_Tnl9FUOPR3Qf2O5gt1AGHSo3b5-Uofg34F6AE,1909
90
- glaip_sdk/cli/slash/tui/remote_runs_app.py,sha256=RCrI-c5ilKV6Iy1lz2Aok9xo2Ou02vqcXACMXTdodnE,24716
90
+ glaip_sdk/cli/slash/tui/remote_runs_app.py,sha256=DOmUHeaBg8puERn-htDnYAJgcUHETl457HamQkd0nxY,28550
91
91
  glaip_sdk/cli/slash/tui/terminal.py,sha256=iC31XChTL34gXY6vXdSIX3HmD36tuA9EYTPZ2Sn4uOI,12108
92
- glaip_sdk/cli/slash/tui/toast.py,sha256=LP_myZwgnrdowrRxGK24lMlx7iZt7iOwFhrbc4NW0DY,3493
92
+ glaip_sdk/cli/slash/tui/toast.py,sha256=QLL6BBBMjEagzpSEPf3PNBNzQG_EdN5JeAigk66AjVs,11920
93
93
  glaip_sdk/cli/slash/tui/theme/__init__.py,sha256=rtM2ik83YNCRcI1qh_Sf3rnxco2OvCNNT3NbHY6cLvw,432
94
94
  glaip_sdk/cli/slash/tui/theme/catalog.py,sha256=G52eU3h8YI9D8XUALVg1KVZ4Lq65VnZdgPS3F_P7XLE,2544
95
95
  glaip_sdk/cli/slash/tui/theme/manager.py,sha256=LBnxEMIwz-8cAlZGYk5tIoAJbOJyGYsmDlyuGJ-LlX4,3945
@@ -109,7 +109,7 @@ glaip_sdk/client/base.py,sha256=BhNaC2TJJ2jVWRTYmfxD3WjYgAyIuWNz9YURdNXXjJo,1824
109
109
  glaip_sdk/client/hitl.py,sha256=dO_q-43miI0oGrJDyUrZ9MbettQp0hai4kjvPaYm010,3545
110
110
  glaip_sdk/client/main.py,sha256=FqN-JIoCTN1pV-3O-ElIbe8t_cWYUDV4S0N8W018De0,9362
111
111
  glaip_sdk/client/mcps.py,sha256=-JdaIkg0QE3egJ8p93eoOPULup8KbM2WRCcwlvqlqrA,14492
112
- glaip_sdk/client/run_rendering.py,sha256=L1mPDPQW_NLs7yi6S1dtJlnTUWVl9R9ioxVzcC8xBrU,27262
112
+ glaip_sdk/client/run_rendering.py,sha256=BKe9a_KnL58XNcGlLvbhJAZBh57e8-ykYiqp0bbS4ZE,28860
113
113
  glaip_sdk/client/schedules.py,sha256=ZfPzCYzk4YRuPkjkTTgLe5Rqa07mi-h2WmP4H91mMZ0,14113
114
114
  glaip_sdk/client/shared.py,sha256=esHlsR0LEfL-pFDaWebQjKKOLl09jsRY-2pllBUn4nU,522
115
115
  glaip_sdk/client/tools.py,sha256=NzQTIsn-bjYN9EfGWCBqqawCIVs7auaccFv7BM_3oCc,23871
@@ -118,6 +118,8 @@ glaip_sdk/client/payloads/agent/__init__.py,sha256=gItEH2zt2secVq6n60oGA-ztdE5mc
118
118
  glaip_sdk/client/payloads/agent/requests.py,sha256=5FuGEuypaEXlWBhB07JrDca_ecLg4bvo8mjyFBxAV9U,17139
119
119
  glaip_sdk/client/payloads/agent/responses.py,sha256=1eRMI4JAIGqTB5zY_7D9ILQDRHPXR06U7JqHSmRp3Qs,1243
120
120
  glaip_sdk/config/constants.py,sha256=Y03c6op0e7K0jTQ8bmWXhWAqsnjWxkAhWniq8Z0iEKY,1081
121
+ glaip_sdk/guardrails/__init__.py,sha256=C1gpL2himmv0FfAsR1ywuvBkwXP54-ziPeqqdAo207k,2677
122
+ glaip_sdk/guardrails/serializer.py,sha256=x4WDaGH-kmaPHnIJNi3aJjToYf4Ru_3mIh3yxSWO25U,2832
121
123
  glaip_sdk/hitl/__init__.py,sha256=hi_SwW1oBimNnSFPo9Yc-mZWVPzpytlnDWNq2h1_fPo,1572
122
124
  glaip_sdk/hitl/base.py,sha256=EUN2igzydlYZ6_qmHU46Gyk3Bk9uyalZkCJ06XMRKJ8,1484
123
125
  glaip_sdk/hitl/callback.py,sha256=icKxxa_f8lxFQuXrZVoTt6baWivFL4a4YioWG_U_8k8,1336
@@ -133,7 +135,8 @@ glaip_sdk/models/mcp.py,sha256=ti_8MUf4k7qbR1gPs9JhqhybMcLUhZxEELtHQrTv2-U,944
133
135
  glaip_sdk/models/schedule.py,sha256=gfL_b9abaWToMtnCD_iXOsmonQ1sq2dZoLcInvCzZ2o,7248
134
136
  glaip_sdk/models/tool.py,sha256=w3nL2DqyCtGgDPCd40Asi9obRGghQjLlC9Vt_p32Mpc,951
135
137
  glaip_sdk/payload_schemas/__init__.py,sha256=nTJmzwn2BbEpzZdq-8U24eVHQHxqYO3_-SABMV9lS_Q,142
136
- glaip_sdk/payload_schemas/agent.py,sha256=Nap68mI2Ba8eNGOhk79mGrYUoYUahcUJLof3DLWtVO4,3198
138
+ glaip_sdk/payload_schemas/agent.py,sha256=tQlTOuRQx4e8XUsEmSNgD8NMURzChYdYwkfKbGpK4nY,3254
139
+ glaip_sdk/payload_schemas/guardrails.py,sha256=5e0BrS1isBs9Wzuz3ktnB9YnpfZJHMIsvmS0wDH36E4,1162
137
140
  glaip_sdk/registry/__init__.py,sha256=mjvElYE-wwmbriGe-c6qy4on0ccEuWxW_EWWrSbptCw,1667
138
141
  glaip_sdk/registry/agent.py,sha256=F0axW4BIUODqnttIOzxnoS5AqQkLZ1i48FTeZNnYkhA,5203
139
142
  glaip_sdk/registry/base.py,sha256=0x2ZBhiERGUcf9mQeWlksSYs5TxDG6FxBYQToYZa5D4,4143
@@ -142,7 +145,7 @@ glaip_sdk/registry/tool.py,sha256=c0Ja4rFYMOKs_1yjDLDZxCId4IjQzprwXzX0iIL8Fio,14
142
145
  glaip_sdk/runner/__init__.py,sha256=orJ3nLR9P-n1qMaAMWZ_xRS4368YnDpdltg-bX5BlUk,2210
143
146
  glaip_sdk/runner/base.py,sha256=KIjcSAyDCP9_mn2H4rXR5gu1FZlwD9pe0gkTBmr6Yi4,2663
144
147
  glaip_sdk/runner/deps.py,sha256=Du3hr2R5RHOYCRAv7RVmx661x-ayVXIeZ8JD7ODirTA,3884
145
- glaip_sdk/runner/langgraph.py,sha256=HWzEkmkQqvAOKat3lENVf0zDaypj7HMeny5thDyprWY,33031
148
+ glaip_sdk/runner/langgraph.py,sha256=AcZPybe8Jxu1KfGQcVuHjy8X7OI36xpMBdAyjMsr9Rc,33070
146
149
  glaip_sdk/runner/logging_config.py,sha256=OrQgW23t42qQRqEXKH8U4bFg4JG5EEkUJTlbvtU65iE,2528
147
150
  glaip_sdk/runner/mcp_adapter/__init__.py,sha256=Rdttfg3N6kg3-DaTCKqaGXKByZyBt0Mwf6FV8s_5kI8,462
148
151
  glaip_sdk/runner/mcp_adapter/base_mcp_adapter.py,sha256=ic56fKgb3zgVZZQm3ClWUZi7pE1t4EVq8mOg6AM6hdA,1374
@@ -207,8 +210,8 @@ glaip_sdk/utils/rendering/steps/format.py,sha256=Chnq7OBaj8XMeBntSBxrX5zSmrYeGcO
207
210
  glaip_sdk/utils/rendering/steps/manager.py,sha256=BiBmTeQMQhjRMykgICXsXNYh1hGsss-fH9BIGVMWFi0,13194
208
211
  glaip_sdk/utils/rendering/viewer/__init__.py,sha256=XrxmE2cMAozqrzo1jtDFm8HqNtvDcYi2mAhXLXn5CjI,457
209
212
  glaip_sdk/utils/rendering/viewer/presenter.py,sha256=mlLMTjnyeyPVtsyrAbz1BJu9lFGQSlS-voZ-_Cuugv0,5725
210
- glaip_sdk-0.7.9.dist-info/METADATA,sha256=Zv0LWJWtHBnmVcDY19GixzfzpVEIGpTUEQeqInAMd5E,8365
211
- glaip_sdk-0.7.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
212
- glaip_sdk-0.7.9.dist-info/entry_points.txt,sha256=NkhO6FfgX9Zrjn63GuKphf-dLw7KNJvucAcXc7P3aMk,54
213
- glaip_sdk-0.7.9.dist-info/top_level.txt,sha256=td7yXttiYX2s94-4wFhv-5KdT0rSZ-pnJRSire341hw,10
214
- glaip_sdk-0.7.9.dist-info/RECORD,,
213
+ glaip_sdk-0.7.10.dist-info/METADATA,sha256=2UcLS7TmXIdgiLE6Ab3U_FtpompLMq4bshiGrqRi3jI,8528
214
+ glaip_sdk-0.7.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
215
+ glaip_sdk-0.7.10.dist-info/entry_points.txt,sha256=NkhO6FfgX9Zrjn63GuKphf-dLw7KNJvucAcXc7P3aMk,54
216
+ glaip_sdk-0.7.10.dist-info/top_level.txt,sha256=td7yXttiYX2s94-4wFhv-5KdT0rSZ-pnJRSire341hw,10
217
+ glaip_sdk-0.7.10.dist-info/RECORD,,