stihia-ai/stihia-sdk-python

GitHub: stihia-ai/stihia-sdk-python

面向 AI 系统的实时威胁检测 Python SDK,提供提示注入识别、敏感数据检测和流式 LLM 输入输出护栏能力。

Stars: 0 | Forks: 0

# Stihia SDK for Python [![Website](https://img.shields.io/badge/stihia.ai-website-blue)](https://stihia.ai) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/421108bf97170318.svg)](https://github.com/stihia-ai/stihia-sdk-python/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/stihia)](https://pypi.org/project/stihia/) [![Python](https://img.shields.io/pypi/pyversions/stihia)](https://pypi.org/project/stihia/) [![License](https://img.shields.io/github/license/stihia-ai/stihia-sdk-python)](LICENSE) 用于 AI 系统的 Stihia 实时威胁检测 API 的 Python SDK。 ## 安装 ``` pip install stihia ``` ## 配置 该 SDK 需要一个 Stihia API 密钥进行身份验证。您可以通过两种方式提供它: ### 选项 1:直接参数(推荐用于显式控制) ``` from stihia import StihiaClient client = StihiaClient( api_key="sk_...", project_key="my-app", user_key="user-123", process_key="chat", ) ``` ### 选项 2:环境变量(推荐用于安全目的) 设置 `STIHIA_API_KEY` 环境变量: ``` export STIHIA_API_KEY="sk_..." ``` 然后在不传递 API 密钥的情况下初始化客户端: ``` from stihia import StihiaClient client = StihiaClient( project_key="my-app", user_key="user-123", process_key="chat", ) ``` **优先级**:如果您同时提供了这两种方式,显式的 `api_key` 参数将优先于环境变量。 ## 快速开始 ``` from stihia import StihiaClient # 初始化 client client = StihiaClient( api_key="sk-...", project_key="my-app", user_key="user-123", process_key="chat", ) # 非阻塞监控 client.sense_background( messages=[{"role": "user", "content": "Hello, world!"}], sensor="default", run_key="session-123", ) # 阻塞调用 (等待结果) result = client.sense( messages=[{"role": "user", "content": "Hello, world!"}], sensor="default", run_key="session-123", ) print(result.payload.sense_result.aggregated_signal.payload.severity) ``` ## 执行模式 ### 后台(非阻塞) 不增加延迟的即发即弃调用: ``` client.sense_background( messages=messages, sensor="prompt-injection", run_key="session-123", on_complete=lambda op: print(f"Completed: {op.uid}"), on_error=lambda e: print(f"Error: {e}"), ) ``` ### 同步阻塞 等待 API 响应: ``` result = client.sense( messages=messages, sensor="prompt-injection", run_key="session-123", ) ``` ### 异步阻塞 用于异步上下文: ``` result = await client.asense( messages=messages, sensor="prompt-injection", run_key="session-123", ) ``` ## Stihia 上下文 使用 `StihiaContext` 为感知操作界定 `thread_key`、`run_key` 和 `process_key` 的作用域。一个上下文等于一个线程中的一次运行。 ``` from stihia import StihiaClient, StihiaContext client = StihiaClient( api_key="sk-...", project_key="my-app", user_key="user-123", ) # 如果省略,将自动生成 thread_key;如果省略,将自动生成 run_key with StihiaContext(process_key="my-workflow", thread_key="conv-123") as ctx: client.sense( messages=[{"role": "user", "content": "First message"}], sensor="prompt-injection", ) client.sense( messages=[{"role": "assistant", "content": "Response"}], sensor="sensitive-data", ) ``` ### 自定义键 提供您自己的 `run_key`: ``` with StihiaContext(process_key="my-process", thread_key="conv-123", run_key="custom-trace-id") as ctx: client.sense(messages=messages, sensor="...") ``` ### 异步支持 可与异步代码无缝协作: ``` async with StihiaContext(process_key="async-workflow", thread_key="conv-123") as ctx: await client.asense(messages=messages, sensor="...") ``` ## SenseGuard `SenseGuard` 使用并发的输入/输出防护机制封装了一个异步 LLM 流。 `input_sensor` 和 `output_sensor` 都是可选的(默认为 `None`)。当 传感器为 `None` 时,将完全跳过相应的 API 调用。这 支持 输入+输出、仅输入、仅输出 或 直通(仅后置处理器)配置。 当设置了 `input_sensor` 时,输入检查将与流并发运行, 但在生成第一个数据块之前完成(门控第一个数据块)。当 `input_sensor` 为 `None` 时,数据块将立即流出,没有输入门控。 ### 基本用法 ``` from stihia import StihiaClient from stihia.guard import SenseGuard client = StihiaClient(api_key="sk-...", project_key="my-app", user_key="u1") # 输入 + 输出 guardrails guard = SenseGuard( client, messages=[{"role": "user", "content": user_input}], input_sensor="default-input", output_sensor="default-output", output_check_interval=5.0, project_key="my-app", user_key="u1", ) chunks = [] async for chunk in guard.shield(llm.astream(prompt)): chunks.append(chunk) if guard.triggered: print("Threat source:", "input" if guard.input_triggered else "output") ``` ### 仅输出(无输入门控) ``` guard = SenseGuard( client, messages=[{"role": "user", "content": user_input}], output_sensor="toxic-content", output_check_interval=3.0, project_key="my-app", user_key="u1", ) async for chunk in guard.shield(llm.astream(prompt)): print(chunk, end="") # chunks flow immediately — no input gate ``` ### 直通(仅后置处理器) ``` from stihia import strip_markdown_images guard = SenseGuard( client, messages=[{"role": "user", "content": user_input}], post_processors=[strip_markdown_images], project_key="my-app", user_key="u1", ) async for chunk in guard.shield(llm.astream(prompt)): print(chunk, end="") # no API calls, only post-processing ``` ### 仅最终输出检查 将 `output_check_interval` 设置为 `None`,以跳过周期性的流中检查,仅 运行最终的流后检查。这减少了 API 调用,避免了流中 中断,同时仍然验证完整的输出。 ``` guard = SenseGuard( client, messages=[{"role": "user", "content": user_input}], input_sensor="default-input", output_sensor="default-output", output_check_interval=None, # final check only project_key="my-app", user_key="u1", ) async for chunk in guard.shield(llm.astream(prompt)): print(chunk, end="") # all chunks delivered without interruption if guard.output_triggered: print("\nOutput flagged after completion") ``` ### 后置处理器 SenseGuard 支持 `post_processors`——即在将每个数据块 生成给调用者之前对其进行转换的可调用对象。传感器始终看到未修改的输出。 内置的 `strip_markdown_images` 处理器会将 `![alt](https://raw.githubusercontent.com/stihia-ai/stihia-sdk-python/main/url)` 转换为 `[alt](url)`,以防止通过自动获取的图像 URL 进行间接提示注入。它使用 `@text_processor` 装饰,因此它适用于普通的 字符串和兼容 OpenAI 的流式数据块: ``` from stihia import SenseGuard, strip_markdown_images guard = SenseGuard( client, messages=messages, input_sensor="default-input", post_processors=[strip_markdown_images], # ... ) async for chunk in guard.shield(llm_stream): print(chunk) # markdown images replaced with plain links ``` 使用 `@text_processor` 装饰器从简单的 `str -> str` 函数 创建您自己的支持数据块的 处理器: ``` from stihia import text_processor @text_processor def redact_emails(text: str) -> str: """Replace email addresses with [REDACTED].""" import re return re.sub(r"\S+@\S+", "[REDACTED]", text) guard = SenseGuard( client, messages=messages, input_sensor="default-input", post_processors=[redact_emails], # ... ) ``` 该装饰器提升了函数,使其: - `str` 输入被直接传递给函数 - 兼容 OpenAI 的数据块对象将提取 `choices[0].delta.content`, 进行转换并重新写入 - 任何其他内容将原样传递 ## 传感器类型 - `default` - 标准威胁检测(提示注入 + PII) - `default-input` - 针对输入的综合威胁检测 - `default-output` - 针对输出的综合威胁检测 - `default-input-think` - 带有附加推理的针对输入的综合威胁检测 ## 开发 有关完整的开发设置和指南,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ``` git clone https://github.com/stihia-ai/stihia-sdk-python.git cd stihia-sdk-python uv sync --all-extras uv run pytest ``` ## 安全 若要报告安全漏洞,请参阅 [SECURITY.md](SECURITY.md)。**请勿为了安全报告而开启公开的 issue。** ## 贡献 我们欢迎各种贡献!在提交 pull request 之前,请阅读 [贡献指南](CONTRIBUTING.md) 和我们的 [行为准则](CODE_OF_CONDUCT.md)。 ## 许可证 本项目根据 [Apache License 2.0](LICENSE) 授权。
标签:AI安全, AMSI绕过, API客户端, API集成, Chat Copilot, Python SDK, Stihia, 人工智能, 可观测性, 大模型安全, 威胁检测, 安全防护, 密钥泄露防护, 开源, 异步处理, 数据监控, 机器学习安全, 用户模式Hook绕过, 网络安全, 计算机取证, 软件开发包, 逆向工具, 隐私保护, 零日漏洞检测, 风控系统