Inline-hook client SDK for FangcunGuard. Lets agents call the FangcunGuard Hook server for input/output safety scanning without changing their LLM URL or API key.
Project description
fangcun-hook-sdk
Inline-hook client SDK for FangcunGuard. Lets your agent call a FangcunGuard Hook server for input/output safety scanning without changing the agent's LLM URL or API key.
agent (your code, your LLM key, your LLM URL)
│
├─ pre-LLM ──► hook.scan_input(messages) ──► allow / block / replace / anonymize
├─ call your LLM as usual
├─ post-LLM ──► hook.scan_output(content) ──► allow / block / replace / restore
▼
agent receives the final message
Install
pip install fangcun-hook-sdk
# optional: bring the framework you actually use
pip install "fangcun-hook-sdk[openai]" # raw OpenAI client wrapper
pip install "fangcun-hook-sdk[agents]" # OpenAI Agents SDK guardrails
Minimal example (raw OpenAI client)
from openai import OpenAI
from fangcun_hook_sdk import HookClient
from fangcun_hook_sdk.adapters.openai_raw import wrap_openai
# Your existing LLM client — unchanged.
llm = OpenAI(api_key="sk-...", base_url="https://api.openai.com/v1")
# Wrap it once. The agent code below sees no difference.
hook = HookClient(base_url="http://localhost:5002", api_key="sk-xxai-...")
llm = wrap_openai(llm, hook)
resp = llm.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "My email is john@example.com"}],
)
print(resp.choices[0].message.content)
# PII is anonymized before reaching the LLM and restored on the way back.
Minimal example (OpenAI Agents SDK)
from agents import Agent, Runner
from fangcun_hook_sdk import AsyncHookClient
from fangcun_hook_sdk.adapters.openai_agents import (
make_input_guardrail, make_output_guardrail,
)
hook = AsyncHookClient(base_url="http://localhost:5002", api_key="sk-xxai-...")
agent = Agent(
name="support-bot",
instructions="You are a helpful assistant.",
input_guardrails=[make_input_guardrail(hook)],
output_guardrails=[make_output_guardrail(hook)],
)
result = await Runner.run(agent, "What is the weather in Tokyo?")
Low-level API
If your framework isn't covered, call the client directly:
from fangcun_hook_sdk import HookClient, Action
hook = HookClient(base_url="http://localhost:5002", api_key="sk-xxai-...")
scan_in = hook.scan_input(messages=[{"role": "user", "content": "..."}])
if scan_in.action == Action.BLOCK:
raise RuntimeError(scan_in.message)
elif scan_in.action == Action.ANONYMIZE:
messages_to_send = scan_in.anonymized_messages
restore_mapping = scan_in.restore_mapping
else:
messages_to_send = original_messages
restore_mapping = None
# ... call your LLM with messages_to_send ...
scan_out = hook.scan_output(
content=llm_reply,
restore_mapping=restore_mapping,
)
if scan_out.action == Action.BLOCK:
raise RuntimeError(scan_out.message)
final_text = scan_out.content if scan_out.action == Action.RESTORE else llm_reply
Failure mode
By default the SDK is fail-open: if the hook server is unreachable or
returns an error, calls return Action.PASS and the agent keeps working.
Pass fail_open=False to surface those errors as exceptions instead.
hook = HookClient(..., fail_open=False)
Talking to a legacy server
If you're pointing at an older FangcunGuard server that only exposes
/v1/gateway/process-input and /v1/gateway/process-output, set:
hook = HookClient(..., primary_path="/v1/gateway")
The new server registers both prefixes, so most users don't need this.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fangcun_hook_sdk-0.1.4.tar.gz.
File metadata
- Download URL: fangcun_hook_sdk-0.1.4.tar.gz
- Upload date:
- Size: 59.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
513e988391523002a85021244f79faec6b271cc0969b3ef47838ec7b657834bb
|
|
| MD5 |
415aa8e797056fb954b12524d8ccc7db
|
|
| BLAKE2b-256 |
cc9b57430d434b5bed59c25a631affb2ebef5ff2b65df965dd77f037f4114ac8
|
File details
Details for the file fangcun_hook_sdk-0.1.4-py3-none-any.whl.
File metadata
- Download URL: fangcun_hook_sdk-0.1.4-py3-none-any.whl
- Upload date:
- Size: 81.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c4a2b20e7580ebf65bbb383ccebfd8574a1f61ab95230b6ddc855bb3bc0b2bb
|
|
| MD5 |
7a95c7095878f611a59577697176ea6f
|
|
| BLAKE2b-256 |
7a5d2592ad931838ad0f865d4d6708448b52873b8ab5935958412c88a0bd363a
|