專員與工具的輔助程式範例程式碼
所提供的範例程式碼會示範如何使用輔助功能程式庫來建置代理程式和工具。
如需輔助功能 API 參考資訊,請參閱 Oracle AI Data Platform Workbench 的輔助功能 API 。
無工具的專員
您可以使用提供的範例程式碼來測試不包含提示、SQL 或 RAG 等工具的 Oracle AI Data Platform AI 代理程式。
# Generated code for SIMPLE_AGENT operator muse_agent_node
from aidputils.agents.toolkit.tool_helper import create_langgraph_tool
from aidputils.agents.toolkit.agent_helper import init_oci_llm, pre_tool_setup, post_tool_setup, pre_invoke_setup
from aidputils.agents.toolkit.configs import AIDPToolConf, OCIAIConf, ModelArgs
from langgraph.prebuilt import create_react_agent
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
import logging
logger = logging.getLogger('SingleAgentNoTool')
class_name = 'SingleAgentNoTool'
checkpointer = globals().get("checkpointer", None)
########## Guardrails Configuration ################
guardrails_config = {
"name" : "Default Guardrails",
"description" : "Default empty guardrails configuration",
"policies" : [ ]
}
########## End Guardrails Configuration ############
########## Start Generated code for Agent Flow ################
########## Generated code for OCI Gen AI LLM
model_args = {
"temperature" : 0.8,
"max_tokens" : 500,
"frequency_penalty" : 0,
"presence_penalty" : 0,
"top_p" : 1.0,
"top_k" : 0
}
llm_conf = OCIAIConf(model_provider='cohere',
compartment_id='<your-compartment-ocid>',
model_args=model_args,
endpoint='https://inference.generativeai.<oci-region>.oci.oraclecloud.com',
model_id='<your-model-id>')
## Agent class definition
class SingleAgentNoTool:
def __init__(self) -> None:
self.agent = None
"""
Setup for LangGraph agent. This includes returns react_agent or compiled langgraph object.
"""
def setup(self) -> None:
logger.info(llm_conf)
# TODO: Handle other kinds of llms, for example openAI or gemini
oci_llm = init_oci_llm(llm_conf)
system_prompt = """
You are an AI Agent
"""
try:
if checkpointer:
self.agent = create_react_agent(model=oci_llm, tools=[], prompt=system_prompt, debug=True, checkpointer= checkpointer)
else:
self.agent = create_react_agent(model=oci_llm, tools=[], prompt=system_prompt, debug=True)
except Exception as e:
# Fallback compile without checkpointer if wiring fails
self.agent = create_react_agent(model=oci_llm, tools=[], prompt=system_prompt, debug=True)
logger.warning(f"Checkpointer could not be initialized {e}")
logger.info(f"Setup for agent completed {self.agent}")
async def invoke(self, user_query: str, **kwargs):
token = pre_tool_setup(**kwargs)
config = pre_invoke_setup(**kwargs)
user_message = HumanMessage(content=user_query)
message = {"messages": [dict(user_message)]}
try:
return await self.agent.ainvoke(input=message, config = config)
except Exception as e:
logger.error(f"Exception while calling invoke {e}")
finally:
post_tool_setup(token)
##########End Generated code for Agent Flow################
SQL 工具測試
此範例程式碼示範如何使用輔助功能來測試 SQL 工具。
from aidputils.agents.tools import utils
from aidputils.agents.auth.util import auth_utils
tool_conf = {'catalogKey': 'aidp_tools_dev',
'schemaKey': 'aidpuser',
'query': 'select * from employees where SALARY>={{SALARY_RANGE}}'}
runtime_params = {"SALARY_RANGE": 60000}
context_vars = {'datalake_id': 'YOUR_DATALAKE_ID'}
try:
tool_result = utils.call_tool_by_class('SQLTool', tool_conf, runtime_params, **context_vars)
print(tool_result)
except Exception as e:
print(f"SQLTool execution failed: {e}")
提示 (LLM) 工具測試
此範例程式碼示範如何使用輔助功能來測試提示工具。
from aidputils.agents.tools import utils
from aidputils.agents.auth.util import auth_utils
tool_conf = {
'prompt_template': 'What is the capital of {country}',
'llm': {
'model_id': 'cohere.command-r-08-2024',
'model_provider': 'cohere',
'model_args': {
'temperature': 1,
'max_tokens': 600,
'frequency_penalty': 0,
'presence_penalty': 0,
'top_k': 0,
'top_p': 0.75
},
'compartment_id': '<your-compartment-ocid>',
'auth_type': 'REMOTE',
'endpoint': 'https://inference.generativeai.<oci-region>.oci.oraclecloud.com',
'auth_profile': 'DEFAULT'
}
}
runtime_params = {'country': 'India'}
context_vars = {'datalake_id': 'YOUR_DATALAKE_ID'}
try:
tool_result = utils.call_tool_by_class('PromptTool', tool_conf, runtime_params, **context_vars)
print(tool_result)
except Exception as e:
print(f"PromptTool execution failed: {e}")
自訂程式碼工具 - Hello World
此範例程式碼示範如何使用輔助功能來測試「自訂程式碼」工具。
Hello World 範例是最簡單的「自訂程式碼」工具。它定義了接受 name 參數並傳回 greeting 的單一工具類別。使用它作為您自己的工具的起點。
工具 _ 導入 .py
from aidputils.agents.tools.custom_tools.base import CustomToolBase
@BaseTool.register
class HelloTool(CustomToolBase):
"""A simple greeting tool."""
@classmethod
def _execute_tool(cls, conf, runtime_params, **context_vars):
name = runtime_params.get("name", "World")
return {"greeting": f"Hello, {name}!"}
工具 _config.json
{
"displayName": "Hello Tool",
"description": "A simple hello world tool",
"tools": [
{
"toolClassName": "HelloTool",
"displayName": "Hello Tool",
"description": "Returns a hello world greeting",
"version": "1.0.0",
"schema": [
{
"name": "name",
"type": "string",
"description": "Name to greet"
}
],
"conf": {}
}
]
}
要求 .txt
# no deps將這三個檔案封裝在 ZIP 封存檔的根目錄,然後透過套裝程序頁籤上傳 ZIP。上傳之後,請切換至參數頁籤,如果您想要覆寫預設值,請填入「描述」,然後切換至測試頁籤來呼叫工具。使用 name="Alice" 時,工具會傳回:
{"greeting": "Hello, Alice!"}自訂程式碼工具 – 開發者工具組
此範例程式碼示範如何使用輔助功能來測試「自訂程式碼」工具。
Developer Toolkit 範例示範一個多工具套裝程式,以及在 utils/ 目錄中使用協助程式模組。此套裝軟體會註冊三個工具 (一個 bash 指令執行程式、一個檔案操作工具和一個 Python 程式碼執行程式),並使用共用的協助程式功能進行輸出截斷和路徑整齊處理。
附註:
Developer Toolkit 是說明性的範例。執行 Bash 命令和執行 Python 程式碼涉及重大的安全考量。在生產環境中,限制 AI 運算、將作業封閉測試環境,並將嚴格的允許清單套用至工具將執行的命令和程式碼樣式。套件版面配置
advanced_tool.zip
├── tool_implementation.py
├── tool_config.json
├── requirements.txt # stdlib only
└── utils/
├── __init__.py
└── text_utils.py # truncate_output, sanitize_path
工具 _ 導入 .py
import subprocess
import os
from aidputils.agents.tools.custom_tools.base import CustomToolBase
from .utils.text_utils import truncate_output, sanitize_path
def _get_cfg(conf, key, default):
"""Read a config value from either the outer dict or the
nested user conf. Coerces numeric settings to int to avoid
type mismatches when values are rendered as strings by the
template substitution layer."""
inner = conf.get("conf") if isinstance(conf, dict) else None
if isinstance(inner, dict) and key in inner:
value = inner[key]
elif isinstance(conf, dict) and key in conf:
value = conf[key]
else:
value = default
if isinstance(default, int) and not isinstance(value, bool):
try:
return int(value)
except (TypeError, ValueError):
return default
return value
@BaseTool.register
class BashTool(CustomToolBase):
"""Execute bash commands and return output."""
@classmethod
def _execute_tool(cls, conf, runtime_params, **context_vars):
command = runtime_params.get("command", "")
timeout = _get_cfg(conf, "timeout", 30)
max_lines = _get_cfg(conf, "max_output_lines", 200)
try:
result = subprocess.run(
["bash", "-c", command],
capture_output=True, text=True, timeout=timeout
)
except subprocess.TimeoutExpired:
# Surface the timeout as a tool failure rather than
# returning {"error": ...}, which would be treated as
# a successful response.
raise RuntimeError(f"Command timed out after {timeout}s")
output = result.stdout or ""
if result.stderr:
output += "\n[stderr]\n" + result.stderr
return {"output": truncate_output(output, max_lines)}
@BaseTool.register
class FileTool(CustomToolBase):
"""Read, write, or list files in the workspace."""
@classmethod
def _execute_tool(cls, conf, runtime_params, **context_vars):
operation = runtime_params.get("operation", "")
path = runtime_params.get("path", "")
content = runtime_params.get("content", "")
base_dir = _get_cfg(conf, "base_dir", "/workspace")
max_size = _get_cfg(conf, "max_file_size_kb", 1024) * 1024
safe_path = sanitize_path(base_dir, path)
if safe_path is None:
raise ValueError("Invalid path: path traversal detected")
if operation == "read":
with open(safe_path, "r") as f:
return {"output": f.read()}
if operation == "write":
parent = os.path.dirname(safe_path)
if parent:
os.makedirs(parent, exist_ok=True)
with open(safe_path, "w") as f:
f.write(content)
return {"output": f"Written {len(content)} chars to {path}"}
if operation == "list":
target = safe_path if os.path.isdir(safe_path) else os.path.dirname(safe_path)
return {"output": "\n".join(sorted(os.listdir(target)))}
raise ValueError(f"Unknown operation: {operation}. Use read/write/list")
@BaseTool.register
class PythonTool(CustomToolBase):
"""Execute Python code in an isolated subprocess."""
@classmethod
def _execute_tool(cls, conf, runtime_params, **context_vars):
code = runtime_params.get("code", "")
timeout = _get_cfg(conf, "timeout", 60)
max_lines = _get_cfg(conf, "max_output_lines", 500)
try:
result = subprocess.run(
["python3", "-c", code],
capture_output=True, text=True, timeout=timeout
)
except subprocess.TimeoutExpired:
raise RuntimeError(f"Execution timed out after {timeout}s")
output = result.stdout or ""
if result.stderr:
output += "\n[stderr]\n" + result.stderr
return {"output": truncate_output(output, max_lines)}
工具 _config.json
{
"displayName": "Developer Toolkit",
"description": "A collection of tools for bash commands, file operations, and Python execution",
"tools": [
{
"toolClassName": "BashTool",
"displayName": "Bash Tool",
"description": "Executes a bash command and returns stdout/stderr output",
"version": "1.0.0",
"schema": [
{
"name": "command",
"type": "string",
"description": "The bash command to execute"
}
],
"conf": {
"timeout": 30,
"max_output_lines": 200
}
},
{
"toolClassName": "FileTool",
"displayName": "File Tool",
"description": "Read, write, or list files in the workspace",
"version": "1.0.0",
"schema": [
{"name": "operation", "type": "string",
"description": "Operation to perform: read, write, or list"},
{"name": "path", "type": "string",
"description": "File or directory path"},
{"name": "content", "type": "string",
"description": "Content to write (for write operation)"}
],
"conf": {
"base_dir": "/workspace",
"max_file_size_kb": 1024
}
},
{
"toolClassName": "PythonTool",
"displayName": "Python Tool",
"description": "Executes Python code in an isolated subprocess and returns the output",
"version": "1.0.0",
"schema": [
{"name": "code", "type": "string",
"description": "The Python code to execute"}
],
"conf": {
"timeout": 60,
"max_output_lines": 500
}
}
]
}
繁體中文 (台灣)
def truncate_output(text, max_lines=200):
if not text:
return ""
try:
max_lines = int(max_lines)
except (TypeError, ValueError):
max_lines = 200
lines = text.strip().split("\n")
if len(lines) > max_lines:
lines = lines[:max_lines] + [f"... ({len(lines) - max_lines} lines truncated)"]
return "\n".join(lines)
def sanitize_path(base_dir, relative_path):
import os
if not relative_path:
return base_dir
full = os.path.normpath(os.path.join(base_dir, relative_path))
if not full.startswith(os.path.normpath(base_dir)):
return None
return full
繁體中文 (台灣)
# Empty file. Required for Python to treat utils/ as a package.要求 .txt
# stdlib only
上傳 ZIP 後,套件頁籤會顯示三個發現的工具,讓您啟用或停用每個工具。參數頁籤顯示可在 BashTool、FileTool 和 PythonTool 之間切換的工具類別下拉式清單,並在右側顯示每一工具組態 (timeout、max_output_lines、base_dir、max_file_size_kb)。
在 Oracle AI Data Platform Workbench 中註冊工具的代理程式
Oracle AI Data Platform Workbench 支援靈活的代理營建與內部工具協調。本主題提供在服務人員內定義、註冊及使用工具的建議方法範例。
1. 透過組態描述工具
每個工具都是 Python 字典:
my_tool = {
"name": "blog_idea_tool",
"description": "Generate blog ideas for a topic.",
"class": "PromptTool",
"conf": {...}, # tool-specific settings
"params": [
{"name": "topic", "type": "string", "description": "Blog topic"}
]
}
2. 在登錄 / 組態中註冊工具
所有使用者工具都是在登錄中收集,以進行代理程式查詢:
tool_conf = {
"blog_idea_tool": my_tool,
"social_post_tool": another_tool,
# ... more tools
}
3. 架構包裝:建立代理程式可使用的工具物件
代理程式建構需要將這些說明轉換為可執行的工具物件 (StructuredTool 或類似版本):
from langchain_core.tools import StructuredTool
def create_langgraph_tool(tool):
def tool_fn(**kwargs):
# Example implementation: you would use utils.call_tool_by_name/tool runner, etc.
return f"Executed {tool['name']} with inputs: {kwargs}"
return StructuredTool.from_function(
func=tool_fn,
name=tool['name'],
description=tool['description'],
args_schema=None, # Build a pydantic schema if detailed validation required
infer_schema=False
)4。記憶體與使用 Checkpointer
AI Data Platform Workbench 中的代理程式通常需要記憶體來保存中間狀態、啟用可再繼續性,並允許在失敗後或跨長時間執行的工作流程進行復原。典型的機制是 checkpointer 物件,可儲存和還原代理程式狀態。
# Suppose you have a 'checkpointer' object available:
# It might be provided to your agent context directly, or created via aidp-agent-runtime utilities
# During agent run:
state = {"step": "tool_invoked", "result": tool_result}
if checkpointer:
checkpointer.save(state)
# To restore later:
loaded_state = checkpointer.load()
print(f"Restored state: {loaded_state}")
# You can persist any serializable agent context, params, or partial results- 將 'checkpointer' 傳送至建構中的代理程式程式碼 / 類別,或作為全域 / 相關資訊環境變數。
- 在每次產生重要代理程式事件之後儲存狀態,例如工具輸出、提示步驟或 LLM。
- 代理程式重新啟動時回復狀態 (如果有的話)。
- 在「AI 資料平台工作台」示範程式碼中,可以透過工作流程組態或全域插入 `checkpointer`,例如 `checkpointer = globals().get ("checkpointer",None) `
- 對於複雜的使用案例,檢查指標可能會包裝外部儲存、資料庫或雲端狀態,以允許強大的故障復原。
# Inside agent code
checkpointer = globals().get("checkpointer", None)
if checkpointer:
checkpointer.save({"step": "after_tool", "context": context_vars})
# ...
restored_state = checkpointer.load()可觀測性:記錄日誌、追蹤以及度量
可觀測性會透過 aidp_observability 套裝程式順暢地整合至 Oracle AI Data Platform Workbench 應用程式,以最少的設定啟用自動遙測 (日誌、追蹤、度量)。
初始化
如以下所示匯入與初始化:
from observability.aidp_observability import AIDPObservability
from observability.config import CollectorConfig
config = CollectorConfig()
config.service_name = "dummy_name"
observability = AIDPObservability(config)
observability.initialize()- 會建立追蹤、度量以及日誌的 OpenTelemetry 匯出器。
- 收集器端點已設定為所有遙測資料 (連接埠 4317、GRpc 協定)。
- 已設定應用程式日誌。
- Playground 模式可讓記憶體內匯出程式即時追蹤顯示。
- 收集器已預先配置為進行日誌循環、緩衝處理,並包含用於遙測匯出的槽。
- 所有遙測訊號都會包含預設度量、日誌及 AI Data Platform Workbench 描述資料。
- 已設定關聯性的預設跨度 / 階段作業屬性 (例如 sessionId、traceId)。
用法模式:
- 使用 OpenTelemetry 計量表作為測量結果。
- 使用 Python 的標準 `logging` 進行日誌記錄。
- 使用 OpenTelemetry 追蹤器進行追蹤。
範例
import logging
import time
from opentelemetry import trace, metrics
tracer = trace.get_tracer(__name__)
meter = metrics.get_meter(__name__)
request_counter = meter.create_counter(
name="requests_total",
description="Number of requests processed",
unit="1",
)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("sample-app")
def process_request(user_id: str):
logger.info("Processing request for user %s", user_id)
request_counter.add(1, {"user.id": user_id})
with tracer.start_as_current_span("process_request") as span:
span.set_attribute("user.id", user_id)
time.sleep(0.1)
span.add_event("request_completed", {"status": "ok"})
if __name__ == "__main__":
for i in range(3):
process_request(f"user-{i}")
time.sleep(1)附註:
系統會自動匯出應用程式遙測;使用者不需要任何儀表變更。可觀察性套件自動工具 LLM 架構和用於追蹤報告的 LangGraph 應用程式。使用 Aidputil 套裝程式建立代理程式和使用狀況
下列範例示範如何建立與使用具有輔助套件的代理程式。
from aidputils.agents.toolkit.agent_helper import invoke, get_client
from aidputils.agents.toolkit.configs import OCIAIConf
from langchain_core.tools import StructuredTool
from langgraph.prebuilt import create_react_agent
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langchain_community.chat_models.oci_generative_ai import ChatOCIGenAI
import logging
import json
logger = logging.getLogger('muse_agent_flow')
checkpointer = globals().get("checkpointer", None)
########## Guardrails Configuration ################
guardrails_config = {
"name" : "Default Guardrails",
"description" : "Default empty guardrails configuration",
"policies" : [ ]
}
########## End Guardrails Configuration ############
########## Start Generated code for Agent Flow ################
##### Start Tool configuration for blog_idea_tool
##### Start PROMPT Tool configuration
blog_idea_tool_def = {
"llm": {
"model_id" : "<your-model-id>",
"model_provider" : "cohere",
"compartment_id" : "<your-compartment-ocid>",
"endpoint" : "https://inference.generativeai.<oci-region>.oci.oraclecloud.com",
"auth_type" : "SECURITY_TOKEN",
"auth_profile" : "DEFAULT",
"model_args" : {
"temperature" : 1,
"max_tokens" : 600,
"frequency_penalty" : 0,
"presence_penalty" : 0,
"top_k" : 0,
"top_p" : 0.75
}
}, "prompt_template": """
You are a master blog strategist.
Your task is to brainstorm compelling blog post ideas based on a given topic.
For the given {topic}, generate 5 unique blog post titles.
For each title, include a one-sentence description of the angle the post would take.
Present the output as a numbered list.
"""
}
blog_idea_tool_params = [ {
"name" : "topic",
"type" : "string",
"description" : "The central theme or subject for which to generate blog ideas."
} ]
blog_idea_tool_dict = {
"name": "blog_idea_tool",
"description": "Use this tool to generate several distinct and engaging blog post titles and concepts based on a topic ",
"tool_class": "PromptTool",
"conf": blog_idea_tool_def,
"params": blog_idea_tool_params
}
blog_idea_tool = create_langgraph_tool(blog_idea_tool_dict)
##### End PROMPT Tool configuration
# Set tool_var_name = blog_idea_tool
# set ns.tool_var_list = [blog_idea_tool]
##### End Tool configuration for Blog idea tool
##### End Tool configuration
##### Start tool List#############
tools_agent1 = [blog_idea_tool]
##### End tool List#############
########## Generated code for OCI Gen AI LLM
model_args = {
"temperature" : 0.8,
"max_tokens" : 500,
"frequency_penalty" : 0,
"presence_penalty" : 0,
"top_p" : 1.0,
"top_k" : 0
}
llm_conf = OCIAIConf(model_provider='cohere',
compartment_id='<your-compartment-ocid>',
auth_type='SECURITY_TOKEN',
auth_profile='DEFAULT',
model_args=model_args,
endpoint='https://inference.generativeai.<oci-region>.oci.oraclecloud.com',
model_id='<your-model-id>')
## Agent class definition
class MuseAgentFlow:
def __init__(self) -> None:
self.agent = None
def setup(self) -> None:
# TODO: Handle other kinds of llms, for example openAI or gemini
oci_llm = init_oci_llm(llm_conf)
system_prompt = """
**Task:**
For the given {topic}, generate 5 unique blog post titles. For each title, include a one-sentence description of the angle the post would take. Present the output as a numbered list.
**Example Input:**
topic: "AI in marketing"
**Example Output:**
1. **Title:** "Beyond the Hype: 3 Practical Ways to Use AI in Your Marketing Today"
* **Angle:** This post will focus on simple, actionable AI tools that small businesses can implement immediately.
2. **Title:** "Is AI Coming for Your Marketing Job? A Realistic Look at the Future"
* * **Angle:** This post will explore how AI will change marketing roles, not just replace them, focusing on new skills.
3. **Title:** "We Let an AI Write Our Marketing Emails for a Week. Here's What Happened."
* * **Angle:** A case-study style post detailing the results of an interesting experiment.
4. **Title:** "The Ethics of AI Marketing: Are You Crossing a Line with Personalization?"
* **Angle:** A thought-leadership piece that discusses the important ethical considerations of using AI.
5. **Title:** "How to Personalize at Scale: A Guide to AI-Powered Customer Journeys"
* **Angle:** A tactical guide on using AI to create highly personalized marketing campaigns.
"""
try:
if checkpointer:
self.agent =create_react_agent(model=oci_llm, tools=tools_agent1, prompt=system_prompt, debug=True, checkpointer= checkpointer)
else:
self.agent = self.agent = create_react_agent(model=oci_llm, tools=tools_agent1, prompt=system_prompt, debug=True)
except Exception as e:
# Fallback compile without checkpointer if wiring fails
self.agent = create_react_agent(model=oci_llm, tools=tools_agent1, prompt=system_prompt, debug=True)
logger.warning(f"Checkpointer could not be initialized {e}")
logger.info(f"Setup for agent completed {self.agent}")
async def invoke(self, user_query: str, **kwargs):
try:
return await self.agent.invoke(input=user_query, **kwargs)
except Exception as e:
logger.error(f"Exception while calling invoke {e}")
def init_oci_llm(llm_conf: OCIAIConf):
chat = ChatOCIGenAI(
model_id='<your-model-id>',
provider='cohere',
service_endpoint='https://inference.generativeai.<oci-region>.oci.oraclecloud.com',
compartment_id='<your-compartment-ocid>',
client=get_client(llm_conf=llm_conf),
model_kwargs=model_args
)
return chat
def create_langgraph_tool(tool):
def tool_fn(**kwargs):
# Example implementation: you would use utils.call_tool_by_name/tool runner, etc.
return f"Executed {tool['name']} with inputs: {kwargs}"
return StructuredTool.from_function(
func=tool_fn,
name=tool['name'],
description=tool['description'],
args_schema=None, # Build a pydantic schema if detailed validation required
infer_schema=False
)
界限組態
您可以在使用 OCIAIConf() 選取基礎模型時,使用輔助功能設定監護人。
從 OCI Generative AI 服務選取基礎模型時,會提供界限組態。在此範例中,選取 xai.grok-4 模型:
from aidputils.agents.toolkit.configs import OCIAIConf
guardrails_config = {
"name" : "<guardrailsName>",
"description" : "<guardrailsDescription>",
"policies" : [ ]
}
model_args = {}
llm_conf = OCIAIConf(model_provider='generic',
compartment_id='<compartment_ocid>',
model_args=model_args,
endpoint='https://inference.generativeai.<oci-region>.oci.oraclecloud.com',
model_id='xai.grok-4',
guardrails_config=guardrails_config)監護人組態是一種類似 JSON 的字串,由一系列原則組成。在上述範例中,定義於此程式碼區塊中,其中 <guardrailsName> 和 <guardrailsDescription> 是使用者定義的名稱和描述:
guardrails_config = {
"name" : "<guardrailsName>",
"description" : "<guardrailsDescription>",
"policies" : [ ]
}原則包含下列關鍵:
| 要點 | 這是必要欄位。 | 描述 | 資料類型 | 預設值 |
|---|---|---|---|---|
policyName
|
編號 | 原則的自訂名稱 | String | 無 |
policyType
|
是 | 要套用的監護人政策類型。
允許的值包括:
|
列舉 | |
policyDescription
|
編號 | 保單的說明 | String | |
scope
|
編號 | 此範圍定義套用界限的位置。
允許的值包括:
|
列舉 | |
action
|
編號 | 違反原則時要採取的動作
允許的值包括:
|
列舉 | |
threshold
|
編號 | 偵測臨界值 。
範圍為介於 0 與 1 之間的機率。 |
浮點數 | |
piiCategories
|
是 | 要偵測的 PII 資料類目及其動作與啟用。 | 陣列 |
piiCategories 也是使用下列索引鍵的類似 JSON 物件陣列:
| 要點 | 這是必要欄位。 | 描述 | 資料類型 | 預設值 |
|---|---|---|---|---|
category
|
是 | 要偵測的 PII 類別。
允許的值包括:
|
String | 無 |
isEnabled
|
編號 | 啟用 PII 分類的偵測。
允許的值包括:
|
列舉 | |
action
|
編號 | 偵測到個人識別資訊類目時要採取的動作。覆寫上面的動作。
允許的值包括:
|
String |
範例:完成界限組態
- 內容審核僅適用於代理程式回應,
- 偵測到提示插入將會封鎖使用者要求,
- 在代理程式回應和使用者要求上偵測到 PII。每個 PII 種類都會以不同的方式處理。
guardrails_config = {
"policies" : [ {
"policyType" : "CONTENT_MODERATION",
"policyName" : "Content Moderation prevention",
"policyDescription" : "Choose an action to take when hate, sexual, violence, toxic, derogatory, or harassment content is detected in either the user input query or the agent response.",
"scope" : "AGENT_RESPONSE",
"action" : "INFORM",
"threshold" : 0.5,
"categories" : [ ]
}, {
"policyType" : "PROMPT_ATTACKS_PREVENTION",
"policyName" : "Prompt Injection prevention",
"policyDescription" : "Choose action when prompt injection is detected on the user query.",
"scope" : "USER_REQUEST",
"action" : "BLOCK",
"threshold" : 0.5
}, {
"policyType" : "PII_DETECTION",
"policyName" : "Personally Identifiable Information (PII) detection",
"policyDescription" : "Choose an action to take when PII entities are detected in either the user input query or the agent response.",
"scope" : "AGENT_RESPONSE",
"action" : "INFORM",
"threshold" : 0.5,
"piiCategories" : [ {
"category" : "PERSON",
"isEnabled" : False,
"action" : "INFORM"
}, {
"category" : "ADDRESS",
"isEnabled" : False,
"action" : "INFORM"
}, {
"category" : "TELEPHONE_NUMBER",
"isEnabled" : True,
"action" : "MASK"
}, {
"category" : "EMAIL",
"isEnabled" : True,
"action" : "MASK"
} ]
}, {
"policyType" : "PII_DETECTION",
"policyName" : "Personally Identifiable Information (PII) detection",
"policyDescription" : "Choose an action to take when PII entities are detected in either the user input query or the agent response.",
"scope" : "USER_REQUEST",
"action" : "INFORM",
"threshold" : 0.5,
"piiCategories" : [ {
"category" : "PERSON",
"isEnabled" : True,
"action" : "INFORM"
}, {
"category" : "ADDRESS",
"isEnabled" : True,
"action" : "INFORM"
}, {
"category" : "TELEPHONE_NUMBER",
"isEnabled" : True,
"action" : "BLOCK"
}, {
"category" : "EMAIL",
"isEnabled" : False,
"action" : "INFORM"
} ]
} ]
}