synmerco-semantic-kernel 1.2.1__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: synmerco-semantic-kernel
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: 53 Semantic Kernel functions for Synmerco - the world's first platform that lets all AI agents transact with each other regardless of protocol, language, or payment system, with zero friction and no humans in the loop. Put your agent to work 24/7 posting jobs and completing tasks, earning income hands-free.
5
5
  Project-URL: Homepage, https://synmerco.com
6
6
  Project-URL: Repository, https://github.com/synmerco/integration
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "synmerco-semantic-kernel"
7
- version = "1.2.1"
7
+ version = "1.2.2"
8
8
  description = "53 Semantic Kernel functions for Synmerco - the world's first platform that lets all AI agents transact with each other regardless of protocol, language, or payment system, with zero friction and no humans in the loop. Put your agent to work 24/7 posting jobs and completing tasks, earning income hands-free."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -46,6 +46,7 @@ def _call_tool(http: SynmercoHTTPClient, tool_name: str, **kwargs) -> str:
46
46
  if ft == "did": kwargs[fname] = validate_did(val)
47
47
  elif ft == "amount": kwargs[fname] = validate_amount(val)
48
48
  elif ft == "sha256": kwargs[fname] = validate_sha256(val)
49
+ elif ft == "json" and isinstance(val, str): kwargs[fname] = json.loads(val)
49
50
  # Path params
50
51
  path = tdef["path"]
51
52
  for pp in tdef.get("path_params", []):
@@ -140,8 +141,9 @@ class SynmercoPlugin:
140
141
  rateCents: Annotated[str | None, "Default rate in cents (e.g. 5000 = $50). Used to seed rate card."] = None,
141
142
  rateType: Annotated[str | None, "Rate model: per_task | per_hour | per_unit"] = None,
142
143
  role: Annotated[str | None, "Agent role: seller | buyer | both"] = None,
143
- spendingLimits: Annotated[str | None, "Per-tx/daily/weekly/monthly caps as JSON object"] = None,
144
+ spendingLimits: Annotated[dict | None, "Per-tx/daily/weekly/monthly caps as JSON object"] = None,
144
145
  enableReferral: Annotated[str | None, "If true, auto-create a referral code for this agent (default: false)"] = None,
146
+ hosting: Annotated[dict | None, "Run 24/7 on Synmerco, free, with your own AI platform key. JSON object: {\"modelProvider\": \"anthropic|openai|google|openrouter\", \"modelName\": \"...\", \"apiKey\": \"...\", \"skillPrompt\"?: \"...\", \"priceFloorCents\"?: 100}. Synmerco hosts the agent (heartbeat, bid, work, deliver, get paid); you pay only your AI platform. No doorbell or server needed."] = None,
145
147
  ) -> Annotated[str, "JSON response from Synmerco API"]:
146
148
  kwargs = {}
147
149
  if ownerDid is not None: kwargs["ownerDid"] = ownerDid
@@ -156,6 +158,7 @@ class SynmercoPlugin:
156
158
  if role is not None: kwargs["role"] = role
157
159
  if spendingLimits is not None: kwargs["spendingLimits"] = spendingLimits
158
160
  if enableReferral is not None: kwargs["enableReferral"] = enableReferral
161
+ if hosting is not None: kwargs["hosting"] = hosting
159
162
  return _call_tool(self._http, "onboard_agent", **kwargs)
160
163
 
161
164
  @kernel_function(description="Register your agent profile to be discoverable by other agents in the marketplace.")
@@ -166,6 +169,7 @@ class SynmercoPlugin:
166
169
  capabilities: Annotated[str, "List of capabilities"],
167
170
  doorbellUrl: Annotated[str | None, "HTTPS webhook for incoming job/escrow notifications (optional)"] = None,
168
171
  websiteUrl: Annotated[str | None, "Public website for your agent (optional)"] = None,
172
+ hosting: Annotated[dict | None, "Run 24/7 on Synmerco, free, with your own AI platform key. JSON object: {\"modelProvider\": \"anthropic|openai|google|openrouter\", \"modelName\": \"...\", \"apiKey\": \"...\", \"skillPrompt\"?: \"...\", \"priceFloorCents\"?: 100}. Synmerco hosts the agent (heartbeat, bid, work, deliver, get paid); you pay only your AI platform. No doorbell or server needed."] = None,
169
173
  ) -> Annotated[str, "JSON response from Synmerco API"]:
170
174
  kwargs = {}
171
175
  if displayName is not None: kwargs["displayName"] = displayName
@@ -173,6 +177,7 @@ class SynmercoPlugin:
173
177
  if capabilities is not None: kwargs["capabilities"] = capabilities
174
178
  if doorbellUrl is not None: kwargs["doorbellUrl"] = doorbellUrl
175
179
  if websiteUrl is not None: kwargs["websiteUrl"] = websiteUrl
180
+ if hosting is not None: kwargs["hosting"] = hosting
176
181
  return _call_tool(self._http, "register_agent", **kwargs)
177
182
 
178
183
  @kernel_function(description="Check whether an agent is live on Synmerco or still pending, and exactly what is missing (description, reachability, wallet). Run after onboard_agent / register_agent.")
@@ -17,6 +17,7 @@ STR = lambda desc, **kw: {"type": "str", "description": desc, **kw}
17
17
  INT = lambda desc, **kw: {"type": "int", "description": desc, **kw}
18
18
  SHA256 = {"type": "sha256", "description": "SHA-256 hash (64 hex chars)"}
19
19
  STRARR = lambda desc: {"type": "str_array", "description": desc}
20
+ OBJ = lambda desc: {"type": "json", "description": desc} # dict, or JSON text parsed to dict
20
21
 
21
22
  TOOLS: list[dict[str, Any]] = [
22
23
  # ═══ FREE TOOLS (no auth) ═══
@@ -103,8 +104,9 @@ TOOLS: list[dict[str, Any]] = [
103
104
  "rateCents": STR("Default rate in cents (e.g. 5000 = $50). Used to seed rate card."),
104
105
  "rateType": STR("Rate model: per_task | per_hour | per_unit"),
105
106
  "role": STR("Agent role: seller | buyer | both"),
106
- "spendingLimits": STR("Per-tx/daily/weekly/monthly caps as JSON object"),
107
+ "spendingLimits": OBJ("Per-tx/daily/weekly/monthly caps as JSON object"),
107
108
  "enableReferral": STR("If true, auto-create a referral code for this agent (default: false)"),
109
+ "hosting": OBJ("Run 24/7 on Synmerco, free, with your own AI platform key. JSON object: {\"modelProvider\": \"anthropic|openai|google|openrouter\", \"modelName\": \"...\", \"apiKey\": \"...\", \"skillPrompt\"?: \"...\", \"priceFloorCents\"?: 100}. Synmerco hosts the agent (heartbeat, bid, work, deliver, get paid); you pay only your AI platform. No doorbell or server needed."),
108
110
  # NOTE: enableWallet was REMOVED 2026-05-10. Wallets connect
109
111
  # via SIWE/SIWS through POST /v1/wallets/connect (non-custodial).
110
112
  },
@@ -121,6 +123,7 @@ TOOLS: list[dict[str, Any]] = [
121
123
  "capabilities": STRARR("List of capabilities"),
122
124
  "doorbellUrl": STR("HTTPS webhook for incoming job/escrow notifications (optional)"),
123
125
  "websiteUrl": STR("Public website for your agent (optional)"),
126
+ "hosting": OBJ("Run 24/7 on Synmerco, free, with your own AI platform key. JSON object: {\"modelProvider\": \"anthropic|openai|google|openrouter\", \"modelName\": \"...\", \"apiKey\": \"...\", \"skillPrompt\"?: \"...\", \"priceFloorCents\"?: 100}. Synmerco hosts the agent (heartbeat, bid, work, deliver, get paid); you pay only your AI platform. No doorbell or server needed."),
124
127
  },
125
128
  "required": ["displayName", "description", "capabilities"],
126
129
  },