deploy
This commit is contained in:
8
a2a.yaml
8
a2a.yaml
@@ -10,3 +10,11 @@ runtime:
|
|||||||
allow_hosts:
|
allow_hosts:
|
||||||
- learnhouse.a2acloud.io
|
- learnhouse.a2acloud.io
|
||||||
deny_internet_by_default: true
|
deny_internet_by_default: true
|
||||||
|
consumer_setup:
|
||||||
|
fields:
|
||||||
|
- name: LEARNHOUSE_API_KEY
|
||||||
|
kind: secret
|
||||||
|
label: LearnHouse API key
|
||||||
|
description: Bearer token or API key for LearnHouse requests.
|
||||||
|
required: true
|
||||||
|
input_type: password
|
||||||
|
|||||||
22
agent.py
22
agent.py
@@ -22,6 +22,8 @@ from a2a_pack import (
|
|||||||
Pricing,
|
Pricing,
|
||||||
Resources,
|
Resources,
|
||||||
RunContext,
|
RunContext,
|
||||||
|
WorkspaceAccess,
|
||||||
|
WorkspaceMode,
|
||||||
skill,
|
skill,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -52,6 +54,7 @@ class Learnhouse(A2AAgent):
|
|||||||
version = "1.2.7"
|
version = "1.2.7"
|
||||||
consumer_setup = ConsumerSetup.from_fields(
|
consumer_setup = ConsumerSetup.from_fields(
|
||||||
ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://learnhouse.a2acloud.io).", required=False, input_type="url"),
|
ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://learnhouse.a2acloud.io).", required=False, input_type="url"),
|
||||||
|
ConsumerSetupField.secret("LEARNHOUSE_API_KEY", label="LearnHouse API key", description="Bearer token or API key for LearnHouse requests.", required=True),
|
||||||
)
|
)
|
||||||
llm_provisioning = LLMProvisioning.PLATFORM
|
llm_provisioning = LLMProvisioning.PLATFORM
|
||||||
pricing = Pricing(
|
pricing = Pricing(
|
||||||
@@ -60,6 +63,11 @@ class Learnhouse(A2AAgent):
|
|||||||
notes="Uses the caller's saved LLM credential through ctx.llm.",
|
notes="Uses the caller's saved LLM credential through ctx.llm.",
|
||||||
)
|
)
|
||||||
resources = Resources(cpu="200m", memory="512Mi")
|
resources = Resources(cpu="200m", memory="512Mi")
|
||||||
|
workspace_access = WorkspaceAccess.dynamic(
|
||||||
|
max_files=50,
|
||||||
|
allowed_modes=(WorkspaceMode.READ_ONLY, WorkspaceMode.READ_WRITE_OVERLAY),
|
||||||
|
require_reason=False,
|
||||||
|
)
|
||||||
egress = EgressPolicy(
|
egress = EgressPolicy(
|
||||||
allow_hosts=('learnhouse.a2acloud.io',),
|
allow_hosts=('learnhouse.a2acloud.io',),
|
||||||
deny_internet_by_default=True,
|
deny_internet_by_default=True,
|
||||||
@@ -336,7 +344,12 @@ class Learnhouse(A2AAgent):
|
|||||||
if requirements is None:
|
if requirements is None:
|
||||||
requirements = ROOT_SECURITY
|
requirements = ROOT_SECURITY
|
||||||
if requirements == []:
|
if requirements == []:
|
||||||
return {}, {}
|
token = _consumer_secret_optional(ctx, "LEARNHOUSE_API_KEY")
|
||||||
|
if not token:
|
||||||
|
raise ConsumerSetupMissing(
|
||||||
|
"operation requires consumer setup secret(s): LEARNHOUSE_API_KEY"
|
||||||
|
)
|
||||||
|
return {"authorization": _learnhouse_auth_header(token)}, {}
|
||||||
missing: list[str] = []
|
missing: list[str] = []
|
||||||
for requirement in requirements or []:
|
for requirement in requirements or []:
|
||||||
if not isinstance(requirement, dict) or not requirement:
|
if not isinstance(requirement, dict) or not requirement:
|
||||||
@@ -380,6 +393,13 @@ class Learnhouse(A2AAgent):
|
|||||||
return {}, {}
|
return {}, {}
|
||||||
|
|
||||||
|
|
||||||
|
def _learnhouse_auth_header(value: str) -> str:
|
||||||
|
token = value.strip()
|
||||||
|
if token.lower().startswith(("bearer ", "basic ", "token ")):
|
||||||
|
return token
|
||||||
|
return f"Bearer {token}"
|
||||||
|
|
||||||
|
|
||||||
def _consumer_secret_optional(ctx: RunContext, name: str | None) -> str:
|
def _consumer_secret_optional(ctx: RunContext, name: str | None) -> str:
|
||||||
if not name:
|
if not name:
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
Reference in New Issue
Block a user