Connection Assistant (V1) is a stateless FastAPI + React web app that helps solutions engineers determine whether an AI endpoint can use a Direct Connection in CalypsoAI, or must be flagged as Proxy Required.
If the endpoint is direct-compatible, the app generates deterministic CalypsoAI workflow YAML.
- Deterministic compatibility decision engine
- Output decision:
Direct ConnectionorProxy Required - Explicit reasons and warnings
- Manual response path override with inline examples
- YAML validation preview before deployment
- YAML generation for:
- No auth
- API key header
- Bearer token (static)
- OAuth2 Client Credentials (2-stage flow)
- Optional provider creation test via API (create provider from generated YAML and report status)
- Optional prompt test via Prompt API (
/prompts) to quickly validate created providers - V2 profile generation flow for proxy-style integrations (YAML +
PROFILES_JSONfragment) - Optional
curlparsing to prefill missing values - Optional OpenAI fallback (
OPENAI_API_KEY) only for response-path suggestion when deterministic detection fails - Stateless: no database, no persistence
GET /healthPOST /analyzePOST /generate-yamlPOST /validate-yamlPOST /generate-profile-yamlPOST /validate-profile-yamlPOST /create-providerPOST /delete-providerPOST /test-provider-prompt
Returns Proxy Required if any condition is true:
streaming_type != noneauth_type == oauth_private_key_jwtauth_type == cookie_sessionauth_type == interactive- endpoint URL is local/private (
localhost,127.0.0.1,10.x.x.x,192.168.x.x,*.svc.cluster.local) - request requires
multipart/form-data - sample success response is not valid JSON
- response requires aggregation of stream chunks
Otherwise returns Direct Connection.
The backend checks these paths in order:
choices[0].message.contentoutput.message.content[0].textdata.output.final_responsedata.output.outputresult.responseresponseDetail.responseanswermessagecontenttext- Fallback to
String.decode(response.body)
cd /path/to/f5-ai-sec-connections-assistant
python3 -m venv .venv
source .venv/bin/activate
pip install -r backend/requirements.txt
uvicorn backend.app.main:app --reload --host 127.0.0.1 --port 8000cd /path/to/f5-ai-sec-connections-assistant/frontend
npm install
npm run devFrontend runs on http://127.0.0.1:5173 and proxies API requests to http://127.0.0.1:8000.
cd /path/to/f5-ai-sec-connections-assistant
docker build -t connection-assistant-v1 .
docker run --rm -p 10000:10000 connection-assistant-v1Open http://127.0.0.1:10000.
- Push this folder to GitHub.
- In Render: New + -> Blueprint.
- Select repo and deploy.
- (Optional) Set
OPENAI_API_KEYenv var.
- Create new Web Service.
- Environment:
Docker. - Select repo.
- Health check path:
/health. - (Optional) Add env vars:
OPENAI_API_KEYOPENAI_MODEL(defaultgpt-5-mini)
{
"endpoint_url": "https://api.example.com/v1/chat/completions",
"http_method": "POST",
"auth_type": "bearer_static",
"headers": {
"X-App-Id": "demo"
},
"request_body": "{\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}",
"prompt_location": "messages[0].content",
"response_content_path": "choices[0].message.content",
"sample_success_response": "{\"choices\":[{\"message\":{\"content\":\"Hello there\"}}]}",
"streaming_type": "none"
}- Decision:
Direct Connection - Reason:
All V1 direct-connection checks passed. - YAML generated with retry request workflow and detected response path.
- Decision:
Proxy Required - Reasons may include:
Streaming type 'sse' requires proxy handling.Request requires multipart/form-data.
- Placeholder message:
Proxy support coming in V2
Use the Generate Profile (V2) action in the UI to create a proxy profile bundle for profile-based routers/loaders.
The generator returns:
profile_yaml: YAML bundle withtype,version, andprofilesmapprofiles_json_fragment: JSON object you can merge intoPROFILES_JSON
Authentication behavior in generated profile steps:
bearer_static:inject_bearer_token: trueapi_key_header: emitsX-API-Key: "{{api_token}}"(or source key variant)oauth_client_credentials: emits deterministic 2-step token flow (token+ target step)
- The app does not generate proxy configuration in V1.
- User data is never persisted.
- Secrets are masked in logs where possible, and warnings are shown if likely secrets are detected in user input.
- If
prompt_locationmatches a field inrequest_body, YAML generation replaces that field with the workflow variablepromptinstead of hardcoded text. - Authorization and API-key headers are emitted as variable placeholders (for example
Authorization: Bearer {{ apiKey }}) instead of fixed secrets. - You can set
response_content_path(for examplemessageorretrieved[0].name) to force the extraction path used foroutputs.content. - If
response_content_pathis syntactically valid but not found in sample JSON, the generator still uses it and adds a warning. - Provider creation test uses
POST {base_url}/providerswith payload fieldsname,template,inputs, andtest. - Provider inputs field accepts either JSON objects or YAML mappings.
- Provider deletion uses
DELETE {base_url}/providers/{provider_id}and sends theAuthorizationheader exactly as entered. - Prompt test uses
POST {base_url}/promptswith payload{ input, provider, verbose }and returns status/outcome/response. - V2 profile generator outputs a proxy profile bundle YAML:
- top-level
profilesmap keyed by profile name - step definitions compatible with profile-loader patterns (
PROFILES_FILE,PROFILES_JSON) - parser mapping inferred from streaming type (
none->json/text,sse->sse,ndjson->ndjson,multipart->multipart,websocket->raw)
- top-level