Skip to content

Release 0.5.0 to main - #58

Merged
chiruu12 merged 3 commits into
mainfrom
dev
Jun 27, 2026
Merged

Release 0.5.0 to main#58
chiruu12 merged 3 commits into
mainfrom
dev

Conversation

@chiruu12

Copy link
Copy Markdown
Collaborator

Promote dev (at Release 0.5.0) to main, matching the prior release convention (main tracks the latest release commit).

Contents since 0.4.1: ten agent-framework integrations (#53 + #56), 72-angle security matrix, and the 0.5.0 version bump (#57). All already green on dev.

Merging with rebase so main advances cleanly to the Release 0.5.0 commit, after which v0.5.0 is tagged here to trigger the PyPI publish.

OpenAI Agents, LangChain, Google ADK, smolagents, DSPy, Strands, Letta. Framework-free cores + lazy native wiring, 62-angle matrix, per-framework live CI legs.
Three more agent-framework adapters (duck-typed cores + lazy native wiring), 62->72 security-matrix angles, per-framework live CI legs, guides, demos.
version 0.4.1 -> 0.5.0; CHANGELOG [Unreleased] -> [0.5.0]. Ships 10 framework integrations (#53 + #56) and the 72-angle security matrix.
@chiruu12
chiruu12 merged commit ba73a5e into mainJun 27, 2026
5 checks passed
@greptile-apps

Copy link
Copy Markdown

Greptile Summary

This PR promotes the 0.5.0 SDK release with new agent-framework integrations.

  • Ten new optional integration adapters under unplug.integrations.
  • New live CI legs and security-matrix coverage for the added adapters.
  • New integration guides, demos, changelog notes, and the 0.5.0 version bump.

Confidence Score: 4/5

The DSPy guarded-tool path needs a small fix before merging.

  • Most new adapters follow the expected guard pattern.
  • DSPy guarded tools can crash when a valid positional call reaches the wrapper.
  • The issue is contained to one wrapper and has a direct local fix.

sdk/src/unplug/integrations/dspy.py

Important Files Changed

FilenameOverview
sdk/src/unplug/integrations/dspy.pyAdds DSPy guards and tool wrapping; the tool wrapper rejects positional calls despite preserving the wrapped signature.
sdk/src/unplug/integrations/openai_agents.pyAdds OpenAI Agents input/output guardrail factories and a local tool guard.
sdk/src/unplug/integrations/google_adk.pyAdds Google ADK before-model and before-tool guardrail callbacks.
sdk/src/unplug/integrations/langchain.pyAdds LangChain runnable guards and a tool-start callback handler.
sdk/src/unplug/integrations/ag2.pyAdds AG2 message hooks and guarded tool wrapping.
sdk/src/unplug/integrations/strands.pyAdds Strands input/output guards and a HookProvider for tool cancellation.
sdk/src/unplug/integrations/letta.pyAdds Letta client-boundary input, output, response, and tool guards.
sdk/src/unplug/integrations/atomic_agents.pyAdds Atomic Agents schema input/output scanning and tool guarding.
sdk/src/unplug/integrations/griptape.pyAdds Griptape task lifecycle scanning and tool guarding.
sdk/pyproject.tomlBumps the package to 0.5.0 and adds optional extras for the new integrations.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Framework input, output, or tool event] --> B[Unplug integration adapter]
B --> C[AgentHooks and Guard]
C --> D{Allowed?}
D -- Yes --> E[Continue framework execution]
D -- No --> F[Raise, tripwire, cancel, or blocked result]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A[Framework input, output, or tool event] --> B[Unplug integration adapter]
B --> C[AgentHooks and Guard]
C --> D{Allowed?}
D -- Yes --> E[Continue framework execution]
D -- No --> F[Raise, tripwire, cancel, or blocked result]
Loading

Fix All in Claude Code

Reviews (1): Last reviewed commit: "Release 0.5.0: ten agent-framework integ..." | Re-trigger Greptile

Comment on lines +100 to +103
@functools.wraps(fn)
def wrapper(**kwargs: Any) -> Any:
require_allowed(h.before_tool_call(tool_name, dict(kwargs)))
return fn(**kwargs)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1Positional Tool Calls Break

functools.wraps makes this wrapper look like the original DSPy tool, but the wrapper only accepts keyword arguments. If DSPy or a caller invokes a guarded one-argument tool as wrapped("paris"), Python raises TypeError before the guard or the tool runs.

Suggested change
@functools.wraps(fn)
defwrapper(**kwargs: Any) ->Any:
require_allowed(h.before_tool_call(tool_name, dict(kwargs)))
returnfn(**kwargs)
@functools.wraps(fn)
defwrapper(*args: Any, **kwargs: Any) ->Any:
payload=dict(kwargs)
ifargs:
payload["args"] =list(args)
require_allowed(h.before_tool_call(tool_name, payload))
returnfn(*args, **kwargs)

Fix in Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@chiruu12