Agentic AI with Stained Glass Proxy (SGP) and Output Protected vLLM.¶
This notebook demonstrates a Pydantic AI agentic workflow using Protopia's Stained Glass Transform (SGT) Proxy and Output Protected vLLM as the data privacy preservation layer. This integration shows how Protopia fits into production-grade agent frameworks while maintaining strong privacy guarantees and delivering uncompromised performance.
Key Features Demonstrated:¶
- Privacy-Preserving Tool Calling: SGT Proxy transforms embeddings before they reach the LLM, protecting sensitive data throughout the agentic workflow.
- End-to-End Protection: Output Protected vLLM encrypts model responses, ensuring data privacy from input through tool execution.
- Production-Ready Integration: Works with industry-standard frameworks (Pydantic AI, OpenAI-compatible APIs) without code changes.
- Performance: Privacy protection adds minimum latency to the agentic loop.
Flow Diagram¶
We adapt this Pydantic AI flow diagram to show SGT Proxy's privacy preservation layer and output protected vLLM response encryption. This flow diagram is for illustration purposes, this demo notebook will use other tools.
sequenceDiagram
participant Agent
participant SGT as Stained Glass Transform<br>Proxy
participant LLM as Output Protected vLLM
activate Agent
Note over Agent: Send Plain Text Prompts
Agent ->> SGT: System: "You're a dice game..."<br>User: "My guess is 4"
deactivate Agent
activate SGT
Note over SGT: SGT Stochastically Transformed Embeddings
SGT ->> LLM: تHDi�&"/SWύl'Lo#2XQJx+vNk
deactivate SGT
activate LLM
Note over LLM: LLM decides to use<br>a tool
LLM ->> SGT: .........<br>(Encrypted Response)
deactivate LLM
activate SGT
Note over SGT: Response Decryption
SGT ->> Agent: Call tool<br>roll_dice()
deactivate SGT
activate Agent
Note over Agent: Rolls a six-sided die
Agent -->> SGT: ToolReturn<br>"4"
deactivate Agent
activate SGT
Note over SGT: SGT Stochastically Transformed Embeddings
SGT ->> LLM: تHDi�&"/SWύl'Lo#2XQ
deactivate SGT
activate LLM
LLM ->> SGT: ..........<br>(Encrypted Response)
deactivate LLM
activate SGT
Note over SGT: Response Decryption
SGT ->> Agent: Your lucky number is 4!
deactivate SGT
Pre-requisites¶
- A live instance of vLLM (>=v0.11.1) OpenAI-Compatible Server, with:
- A live instance of SGT Proxy (Please refer to the deployment instructions) with tool calling enabled.
Enabling Tool Calling on SGP
Tool parsers detect and extract function calls from the model outputs. Set SGP_TOOL_PARSER to a valid parser (e.g., llama3_json for Llama-3.1-8B-Instruct). Find available parsers with vllm serve -h | grep tool-call-parser.
Install Dependencies and Imports¶
Install the required pydantic-ai package and import necessary modules for building an agentic AI application with Stained Glass Transform Proxy.
Tip
For this demo we are only using the Open AI API, we install slimmed down version pydantic-ai-slim[openai].
from dataclasses import dataclass
from typing import Literal
import httpx
import markdown
from IPython.display import Markdown
from pydantic import BaseModel, Field
from pydantic_ai import Agent, ModelSettings, RunContext
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider
Setup SGT Proxy Client¶
Configuration Required
Update these parameters for your specific setup:
- PROXY_URL: Your proxy server endpoint
- MODEL_NAME: The base model you want to test
- API_KEY: Your authentication key
# Set proxy access parameters.
PROXY_URL = "http://127.0.0.1:3302/v1"
MODEL_NAME = "meta-llama/Llama-3.1-8B-Instruct"
API_KEY = None
# Verify that the model is accessible through the SGT Proxy.
provider = OpenAIProvider(base_url=PROXY_URL, api_key=API_KEY)
response = await provider.client.chat.completions.create(
model=MODEL_NAME,
messages=[{"role": "user", "content": "Hello, world!"}],
max_tokens=5,
)
assert response.choices[0].message.content.strip() != "", (
"Empty response from model"
)
"✅ SGT Proxy is accessible and responding correctly."
'✅ SGT Proxy is accessible and responding correctly.'
model = OpenAIChatModel(model_name=MODEL_NAME, provider=provider)
model.model_name
'meta-llama/Llama-3.1-8B-Instruct'
# Pydantic AI leverages a dependency injection system to provide data and services to the agent.
# In this case, we define a ToolClient that provides an HTTP client and base URL to our Q&A support tools.
@dataclass
class ToolClient:
url: str
http_client: httpx.AsyncClient
# Pydantic AI leverages the model's tool calling capability to make it return structured data.
# This AgentResponse model defines the expected structure of the agent's response when answering
# questions about the API documentation.
class AgentResponse(BaseModel):
path: str = Field(
..., description="The API endpoint path, e.g., /chat/completions"
)
method: Literal["GET", "POST", "PUT", "DELETE", "PATCH"] = Field(
..., description="The HTTP method to use for the request"
)
answer: str = Field(
...,
description="The answer to the user's question based on the API documentation",
)
example: dict = Field(
...,
description="An JSON example of how to call the API endpoint to achieve the desired functionality",
)
Tip
Agents are Pydantic AI's primary interface for interacting with LLMs. In this demo a single Agent will control the entire workflow, but multiple agents can also interact to embody more complex workflows.
api_qa_agent = Agent(
model=model,
model_settings=ModelSettings(
max_tokens=1024,
# Llama-3.*-8B only supports one tool call at a time.
# see chat template: (https://github.com/vllm-project/vllm/blob/main/examples/tool_chat_template_llama3.2_json.jinja#L107)
parallel_tool_calls=False,
),
deps_type=ToolClient,
output_type=AgentResponse,
output_retries=2,
system_prompt=(
"You are an API support agent. To answer any API questions, follow these steps:\n"
"1. Use the `list_all_paths` tool to get a list of all SGT Proxy API paths and their summaries\n"
"2. After selecting one of the available paths, use `read_protopia_docs` to get detailed documentation and examples of that path.\n",
),
)
Define Function Tools¶
Function Tools let agents perform actions and retrieve information to generate responses. For this demo, this agent will access Protopia's SGT Proxy API documentation to answer developer integration questions.
@api_qa_agent.tool(retries=2)
async def list_all_paths(ctx: RunContext[ToolClient]) -> dict:
"""Fetches Protopia's Stained Glass Transform Proxy API documentation and returns a dictionary of all SGT Proxy API paths with brief summaries.
Args:
ctx: The pydantic ai run context.
Returns:
A dictionary of all API paths with their summaries.
"""
url = ctx.deps.url
client = ctx.deps.http_client
print(f"🛠️ tool call: list_all_paths for {url=}")
response = await client.get(url)
response.raise_for_status()
api_docs_dict = response.json()
paths = {}
for path, docs in api_docs_dict["paths"].items():
# defaults to the summary for the first method found for the path
method = next(iter(docs.keys()))
paths[path] = docs[method]["summary"]
assert paths, "Failed to fetch API paths"
return paths
@api_qa_agent.tool(retries=2)
async def read_protopia_docs(
ctx: RunContext[ToolClient], path: str | None = None
) -> dict:
"""Fetches Protopia's Stained Glass Transform Proxy API documentation.
For context economization, if a specific API path is provided only the documentation for that path is returned.
Args:
ctx: The pydantic ai run context.
path: The API path to fetch documentation from.
Returns:
The documentation for the specified API path.
"""
url = ctx.deps.url
client = ctx.deps.http_client
print(f"🛠️ tool call: read_protopia_docs with input {path=}")
response = await client.get(url)
response.raise_for_status()
api_docs_dict = response.json()
assert api_docs_dict, "Failed to fetch API documentation"
return (
api_docs_dict["paths"].get(
path,
{
"error": "API path does not exist, call `list_all_paths` tool for a list of valid paths"
},
)
if path
else api_docs_dict
)
QUESTION = "What API path should I query to get transformed embeddings and obfuscation score?"
async with httpx.AsyncClient() as http_client:
tool_client = ToolClient(
url="https://docs.protopia.ai/stained-glass-transform-proxy/latest/openapi.json",
http_client=http_client,
)
# Run the agent to get an answer based on the API docs.
response = await api_qa_agent.run(deps=tool_client, user_prompt=QUESTION)
output = response.output
🛠️ tool call: list_all_paths for url='https://docs.protopia.ai/stained-glass-transform-proxy/latest/openapi.json' 🛠️ tool call: read_protopia_docs with input path='/v1/stainedglass'
# Display the formatted agent's response.
display(
Markdown(
markdown.markdown(
f"### Developer Question:\n\n{QUESTION}\n\n"
f"### Agent Response:\n\n"
f"`path`: {output.path}\n\n"
f"`method`: {output.method}\n\n"
f"`answer`: {output.answer}\n\n"
f"`example`: {output.example}"
)
)
)
Developer Question:
What API path should I query to get transformed embeddings and obfuscation score?
Agent Response:
path: /v1/stainedglass
method: GET
answer: To get transformed embeddings and obfuscation score, you should query the /v1/stainedglass API path.
example: {'messages': [{'role': 'system', 'content': 'You are an assistant.'}, {'role': 'user', 'content': 'Hello! This chat is using Stained Glass Transform for data protection.'}], 'return_transformed_embeddings': True, 'return_reconstructed_prompt': True, 'return_obfuscation_score': True}
SGT Proxy's Protection Mechanisms¶
As demonstrated in other tutorials, the /stainedglass endpoint offers insights into SGT Proxy's protection mechanisms by providing access to:
- Plain (un-transformed) LLM embeddings
- Transformed LLM embeddings
- Reconstructed text from SGT protected embeddings
- Obfuscation scores
Let's use this endpoint to explore SGT Proxy's role as a privacy-preserving layer in this agentic workflow.
# Map a pydantic_ai messages to a openai messages dict
messages = await model._map_messages(response.all_messages(), None)
payload = {"messages": messages}
import requests
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
}
stained_glass_response = requests.post(
f"{PROXY_URL}/stainedglass",
headers=headers,
json=payload
| {
"return_plain_text_embeddings": True,
"return_transformed_embeddings": True,
"return_reconstructed_prompt": True,
"return_obfuscation_score": True,
},
stream=False,
timeout=30,
)
stained_glass_response.raise_for_status()
Check plain text conversation¶
display(
Markdown(
markdown.markdown(
f"# Conversation Plain Text\n\n{''.join(stained_glass_response.json()['tokenized_plain_text'])}"
)
)
)
Conversation Plain Text
You are an API support agent. To answer any API questions, follow these steps:
1. Use the list_all_paths tool to get a list of all SGT Proxy API paths and their summaries
2. After selecting one of the available paths, use read_protopia_docs to get detailed documentation and examples of that path.
What API path should I query to get transformed embeddings and obfuscation score?list_all_paths{\"/v1/chat/completions\":\"Creates a model response for the given chat conversation.\",\"/v1/stainedglass\":\"Apply Stained Glass Transform to a conversation and see the transformed embeddings or attempted reconstruction.\",\"/v1/models\":\"Returns list of available models.\",\"/v1/models/{model_name}\":\"Retrieves a model instance, providing basic information about the model.\",\"/readyz\":\"Perform a readyz check\",\"/livez\":\"Perform a livez check\"}read_protopia_docspath/v1/stainedglass{\"post\":{\"tags\":[\"Stained Glass Transform\"],\"summary\":\"Apply Stained Glass Transform to a conversation and see the transformed embeddings or attempted reconstruction.\",\"description\":\"Apply Stained Glass Transform to the given conversation.\n\nArgs:\n stainedglass_request: Request body for Stained Glass Transform.\n stained_glass_transform_manager: Stained Glass Transform manager to get an async interface to blocking torch calls.\n\nRaises:\n InternalServerError: If an unexpected errors occurs during reconstruction or computing obfuscation score.\n\nReturns:\n Response body for Stained Glass Transform.\",\"operationId\":\"apply_stainedglass_v1_stainedglass_post\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/StainedGlassRequest\"},\"examples\":{\"return transformed embeddings\":{\"summary\":\"return transformed embeddings\",\"description\":\"Response includes SGT-transformed embeddings that protect input data at inference time.\",\"value\":{\"messages\":[{\"role\":\"system\",\"content\":\"You are a helpful assistant.\"},{\"role\":\"user\",\"content\":\"Hello! This chat is using Stained Glass Transform for data protection\"}],\"return_transformed_embeddings\":true,\"return_reconstructed_prompt\":false}},\"+ reconstructed prompt\":{\"summary\":\"+ reconstructed prompt\",\"description\":\"Response includes reconstructed tokens & text from L2 similarity search of SGT-transformed embeddings against the target model input embedding layer.\",\"value\":{\"messages\":[{\"role\":\"system\",\"content\":\"You are a helpful assistant.\"},{\"role\":\"user\",\"content\":\"Hello! This chat is using Stained Glass Transform for data protection\"}],\"return_transformed_embeddings\":true,\"return_reconstructed_prompt\":true}},\"+ obfuscation score\":{\"summary\":\"+ obfuscation score\",\"description\":\"Response includes obfuscation score percentage measuring protection strength of transformed embeddings.\",\"value\":{\"messages\":[{\"role\":\"system\",\"content\":\"You are a helpful assistant.\"},{\"role\":\"user\",\"content\":\"Hello! This chat is using Stained Glass Transform for data protection\"}],\"return_transformed_embeddings\":true,\"return_reconstructed_prompt\":true,\"return_obfuscation_score\":true}},\"+ latency metrics\":{\"summary\":\"+ latency metrics\",\"description\":\"Response includes latency metrics for SGT and unprotected tokenizer embedding computation.\",\"value\":{\"messages\":[{\"role\":\"system\",\"content\":\"You are a helpful assistant.\"},{\"role\":\"user\",\"content\":\"Hello! This chat is using Stained Glass Transform for data protection\"}],\"return_transformed_embeddings\":true,\"return_reconstructed_prompt\":true,\"return_obfuscation_score\":true,\"return_stained_glass_transform_latency\":true,\"return_unprotected_tokenizer_embedding_latency\":true}}}}},\"required\":true},\"responses\":{\"200\":{\"description\":\"Successful Response\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/StainedGlassResponse\"}}}},\"422\":{\"description\":\"Validation Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/HTTPValidationError\"}}}}}}}final_resultpath/v1/stainedglassmethodGETanswerTo get transformed embeddings and obfuscation score, you should query the /v1/stainedglass API path.examplemessages[{'role': 'system', 'content': 'You are an assistant.'}, {'role': 'user', 'content': 'Hello! This chat is using Stained Glass Transform for data protection.'}]return_transformed_embeddingsTruereturn_reconstructed_promptTruereturn_obfuscation_scoreTrueFinal result processed.
🕵️♂️ Reconstructed Conversation and Obfuscation Score¶
display(
Markdown(
markdown.markdown(
f"# Reconstructed Text\n\n{stained_glass_response.json()['reconstructed_prompt']}"
)
)
)
Reconstructed Text
*angstromtalya ціка диза найкраџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџuseRalativeImagePath無しさんárníCppI диза Českosloven νεφοκ">
erusformџџџџџџџџџџџџџџџџiếquotelevdrFc назна>();
">
।”
erusformárníquotelev назнаdıktaniyesi無しさんGT* диза найкраerusform();
talya">
џџџџџџџџџџџџџџџџ розви無しさんџџџџџџџџrodníquotelev "";
найкра -->
">
drFctalya){
)))));
erusformární
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџerusform>();
quoteleverusformQPCPselectorMethod mücadel▋▋ найкра Coğrafrodní "";
erusformárníatrigesimaltalya_ComCallableWrapper дизаfusc醴醴 },
підтрим назнаtalya* ">
MethodBeatџџџtalyaextracomment>();
uvědomQPCPquotelevџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ -->
quotelevџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ "";
//{ џџiyesi использовани">
ezpečџџџ>();
();
();
uvědomiCppGuid>();
();
.**erusformquotelev_ComCallableWrappermüştürназнач>taggertalyavajícíčemž ।”
џџiyesi использовани№№№№ визнач руководtalya uvědom hexatrigesimal№№№№dıktan">
Českosloven PodsDummyiyesi использовани">
визнач руковод>();
drFctalya無しさんџџ 갤로그 диза*
();
quotelevџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ醴醴uyordu">
найкраıntıquotelev醴醴iyesi использовани">
chtě zprac uvědom.**müştür диза* čemž uvědom */
uyệ醴醴 uvědom.**quotelevџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtalyačemž uvědomџџџ kurtul醴醴* talya* позволя){
руковод";
();
();
QPCP\":{\"talyaџџ uvědom использовани диза>();
();
.** uvědom údaiyesi диза uvědomiCppGuid>();
();
.**erusformquoteleveştirerusformmüştürquotelevatrigesimaltalyaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ।”
џџiyesi использовани iNdExiyesi jyllandCppGuid>();
();
.**erusformquotelevmüştüruseRalativeImagePath zvláiyordu zvláiyordutalya uvědom▏▏ údaџџџ>();
talya">
talya найкра -->
CppGuid>();
();
.**україн zvláeştir údaџџџ
talya>();
">
CppGuid>();
Glass.** найкраerusformární nhiễ dejtingsCppGuiderusform ।”
pornofil">
useRalativeImagePath zvláeştir zvláeştir>();
uvědom▏▏ úda・━・━・━・━ServerError">
quotelevrodníџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ।”
uvědomiyesi ।”
nhiễ диза дизаfusciyesi },
useRalativeImagePath zvláeştireştirtalya uvědom▏▏ údaiệ розви -->
CppGuid>();
();
.** найкраiyesiiyesilacağı дизаiyesi кандиtalya>();
();
_AdjustorThunk руководiệ>();
();
();
uvědom jyllandisayar\":{\"talya\":{\">();
jyllandi переваiџџџ 네이트온 uvědom hexatrigesimal>();
использовани переваџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ>();
talyamuşturiyesimuşturextracommentitalyaatrigesimaltalyaiџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtalyaatrigesimaltalya uvědom iNdEx uvědomiệ uvědomџЭ>();
talyaiyesitalyarodní */
iyesiџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ hexatrigesimal відрізџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџiyesiselectorMethodQPCPitalyaџџiyesi出品者 uvědom uvědom uvědomãeste uvědom hexatrigesimal дозволяquotelev 百度收录ческихiyesiџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџselectorMethod považ uvědom },
uvědomextracomment uvědom vystav підтрим>
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџární mezináCppGuid>();
();
.** -->
।”
muşturiyesiiyesitalyatalyaџЭtalya uvědomџџџiyesiiyesi диза>();
;
uvědomiyesiiyesi розвит>();
jyllandiџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ uvědomџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ>();
uvědom uvědom iNdEx uvědomiệ připoj>();
醴醴erusformџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ přirozCppGuid jednoduџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ">
quotelevџЭ* talyaiyesitalyaiyesiquotelev ।”
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ">
iệ>();
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџiyesi перева\":{\"talyatalyaiyesi обеспе uvědom uvědom uvědomãeste uvědom hexatrigesimalgıçquotelevgıç �iyesi uvědommuştur出品者 uvědom 갤로그 uvědom thuisontvangst uvědomборатор підтрим препараatrigesimalџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCppGuid>();
();
.** -->
।”
selectorMethodiyesiiyesitalyatalyaџЭtalyaiyesiiyesiiyesitalya диза>();
;
uvědomџџџiyesimuştur mezináezpečfusc найкра },
iџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ uvědom розвитCppGuidfuscãeste uvědom iNdEx uvědom lớiyesi дизаfusciyesi },
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ।”
।”
quotelevatrigesimaltalyaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџiyesi использованиQPCPitalyatalya出品者 uvědom uvědomãeste uvědom hexatrigesimal дозволяquotelevgıçческихiyesiiyesimuştur出品者 uvědomextracomment uvědomãeste uvědom vystav підтрим препараatrigesimalџџџџџџџџџџџџџџџџ mezináCppGuid>();
();
.**erusform "";
iyesiiyesiiyesitalyatalyaџЭtalyaiyesiiyesiiyesitalya диза>();
talyaiyesi uvědomiyesitalyatalyafusciyesi>();
iyesiџџџiyesi uvědom розвит>();
।”
iџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ uvědomџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ;
।”
uvědom iNdEx uvědomiệárnítalya ।”
erusformџЭ* erusformtalya tokenizer дизаQPCP найкраiyesiiyesiQPCPitalyamüştüriyesi использовани出品者 uvědom uvědom uvědomtalya uvědom hexatrigesimal дозволяquotelevgıç �iyesiiyesiselectorMethodtalya uvědom 갤로그 uvědomtalya uvědom jyllandукраїнselectorMethodatrigesimalџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCppGuid>();
();
talya -->
।”
iyesiiyesiiyesitalyatalyaџЭtalya uvědom найкраiyesitalya диза>();
;
uvědomiyesiiyesitalyatalyafusciyesiextracommentiyesiџџџiyesitalyatalya>();
talya_latencyiyesi найкраiyesitalyaCppGuid* 醴醴* talya_latency uvědomiyesiiyesiiyesiiyesiiyesitalyaiyesiiyesi uvědomiyesi>();
\":{\" každ\":{\" iNdEx uvědom дизаџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ uvědomtalya\":{\"CppGuid jyllandi 百度收录i№№№№ uvědomlarından найкра использовани переваџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ>();
talyamuşturiyesiiyesimuşturtalyai iNdEx uvědomateř醴醴 uvědomtalya\":{\" диза jyllanditalyai№№№№ uvědom>();
использовани переваselectorMethod)ValidationErrormuşturiyesiiyesiiyesiiềtalyaCppGuid▏▏ руковод>();
();
();
갤로그eştir typingsJapgollyezpečárníatrigesimaltalya mezináCppGuidfusc найкра },
νεφοκџџџџџџџџџџџџџџџџlıklı
quotelev№№№№_AdjustorThunkџџџ ।”
();
();
ezpeQPCPукраїн дизаtalyaselectorMethod['<{ обеспе uvědomџџџ uvědomuseRalativeImagePathuseRalativeImagePathtalya">
џџџ hexatrigesimaltalyaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџческих uvědommaması['<{ обеспе">
џџџ 갤로그 údauseRalativeImagePathtalya">
џџџ vystav підтрим>
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџerusform mezináџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ>();
();
.** -->
।”
uvědom">
talyatalyaџЭtalya переваtalya▏▏>();
;
переваtalyatalyafusc найкра>();
перева перева hexatrigesimalQPCPукраїн
display(
Markdown(
markdown.markdown(
f"# Obfuscation Score\n\n{round(stained_glass_response.json()['obfuscation_score'], 2)}"
)
)
)
Obfuscation Score
0.97