intentkit 0.7.5.dev20__py3-none-any.whl → 0.7.5.dev22__py3-none-any.whl

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.

Potentially problematic release.


This version of intentkit might be problematic. Click here for more details.

Files changed (56) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/config/config.py +1 -0
  3. intentkit/core/engine.py +10 -11
  4. intentkit/models/agent.py +84 -56
  5. intentkit/models/agent_schema.json +1 -146
  6. intentkit/models/llm.csv +5 -0
  7. intentkit/models/llm.py +36 -3
  8. intentkit/skills/acolyt/schema.json +4 -3
  9. intentkit/skills/aixbt/schema.json +4 -4
  10. intentkit/skills/allora/schema.json +3 -2
  11. intentkit/skills/basename/schema.json +2 -1
  12. intentkit/skills/carv/schema.json +134 -137
  13. intentkit/skills/casino/schema.json +0 -1
  14. intentkit/skills/cdp/schema.json +2 -1
  15. intentkit/skills/chainlist/schema.json +3 -5
  16. intentkit/skills/common/schema.json +2 -2
  17. intentkit/skills/cookiefun/schema.json +2 -4
  18. intentkit/skills/cryptocompare/schema.json +3 -3
  19. intentkit/skills/cryptopanic/schema.json +105 -103
  20. intentkit/skills/dapplooker/schema.json +3 -5
  21. intentkit/skills/defillama/schema.json +5 -1
  22. intentkit/skills/dexscreener/schema.json +91 -93
  23. intentkit/skills/dune_analytics/schema.json +104 -99
  24. intentkit/skills/elfa/schema.json +3 -2
  25. intentkit/skills/enso/schema.json +3 -2
  26. intentkit/skills/erc20/schema.json +2 -1
  27. intentkit/skills/erc721/schema.json +2 -1
  28. intentkit/skills/firecrawl/schema.json +2 -6
  29. intentkit/skills/github/schema.json +3 -4
  30. intentkit/skills/heurist/schema.json +2 -2
  31. intentkit/skills/http/schema.json +4 -5
  32. intentkit/skills/lifi/schema.json +17 -8
  33. intentkit/skills/moralis/schema.json +7 -2
  34. intentkit/skills/morpho/schema.json +1 -1
  35. intentkit/skills/nation/schema.json +4 -3
  36. intentkit/skills/openai/schema.json +2 -3
  37. intentkit/skills/portfolio/schema.json +3 -5
  38. intentkit/skills/pyth/schema.json +3 -1
  39. intentkit/skills/slack/schema.json +2 -2
  40. intentkit/skills/supabase/schema.json +2 -3
  41. intentkit/skills/superfluid/schema.json +1 -1
  42. intentkit/skills/system/schema.json +2 -4
  43. intentkit/skills/tavily/schema.json +3 -5
  44. intentkit/skills/token/schema.json +3 -6
  45. intentkit/skills/twitter/schema.json +2 -2
  46. intentkit/skills/unrealspeech/schema.json +2 -5
  47. intentkit/skills/venice_audio/schema.json +151 -152
  48. intentkit/skills/venice_image/schema.json +267 -267
  49. intentkit/skills/web_scraper/schema.json +2 -6
  50. intentkit/skills/weth/schema.json +2 -1
  51. intentkit/skills/wow/schema.json +1 -1
  52. intentkit/skills/xmtp/schema.json +69 -71
  53. {intentkit-0.7.5.dev20.dist-info → intentkit-0.7.5.dev22.dist-info}/METADATA +1 -1
  54. {intentkit-0.7.5.dev20.dist-info → intentkit-0.7.5.dev22.dist-info}/RECORD +56 -56
  55. {intentkit-0.7.5.dev20.dist-info → intentkit-0.7.5.dev22.dist-info}/WHEEL +0 -0
  56. {intentkit-0.7.5.dev20.dist-info → intentkit-0.7.5.dev22.dist-info}/licenses/LICENSE +0 -0
intentkit/__init__.py CHANGED
@@ -3,7 +3,7 @@
3
3
  A powerful platform for building AI agents with blockchain and cryptocurrency capabilities.
4
4
  """
5
5
 
6
- __version__ = "0.7.5-dev20"
6
+ __version__ = "0.7.5-dev22"
7
7
  __author__ = "hyacinthus"
8
8
  __email__ = "hyacinthus@gmail.com"
9
9
 
@@ -92,6 +92,7 @@ class Config:
92
92
  self.eternal_api_key = self.load("ETERNAL_API_KEY")
93
93
  self.reigent_api_key = self.load("REIGENT_API_KEY")
94
94
  self.venice_api_key = self.load("VENICE_API_KEY")
95
+ self.gatewayz_api_key = self.load("GATEWAYZ_API_KEY")
95
96
  # LLM Config
96
97
  self.system_prompt = self.load("SYSTEM_PROMPT")
97
98
  self.intentkit_prompt = self.load("INTENTKIT_PROMPT")
intentkit/core/engine.py CHANGED
@@ -422,8 +422,8 @@ async def stream_agent_raw(
422
422
  input_message = re.sub(r"\b@web\b", "", input_message).strip()
423
423
 
424
424
  # content to llm
425
- content = [
426
- {"type": "text", "text": input_message},
425
+ messages = [
426
+ HumanMessage(content=input_message),
427
427
  ]
428
428
  # if the model doesn't natively support image parsing, add the image URLs to the message
429
429
  if image_urls:
@@ -431,23 +431,22 @@ async def stream_agent_raw(
431
431
  agent.has_image_parser_skill(is_private=is_private)
432
432
  and not model.supports_image_input
433
433
  ):
434
- input_message += f"\n\nImages:\n{'\n'.join(image_urls)}"
435
- content = [
436
- {"type": "text", "text": input_message},
434
+ image_urls_text = "\n".join(image_urls)
435
+ input_message += f"\n\nImages:\n{image_urls_text}"
436
+ messages = [
437
+ HumanMessage(content=input_message),
437
438
  ]
438
439
  else:
439
440
  # anyway, pass it directly to LLM
440
- content.extend(
441
+ messages.extend(
441
442
  [
442
- {"type": "image_url", "image_url": {"url": image_url}}
443
+ HumanMessage(
444
+ content={"type": "image_url", "image_url": {"url": image_url}}
445
+ )
443
446
  for image_url in image_urls
444
447
  ]
445
448
  )
446
449
 
447
- messages = [
448
- HumanMessage(content=content),
449
- ]
450
-
451
450
  # stream config
452
451
  thread_id = f"{user_message.agent_id}-{user_message.chat_id}"
453
452
  stream_config = {
intentkit/models/agent.py CHANGED
@@ -1466,81 +1466,109 @@ class Agent(AgentCreate, AgentPublicInfo):
1466
1466
  ):
1467
1467
  model_property["default"] = new_enum[0]
1468
1468
 
1469
- # Process skills property using defaults merged with database overrides
1469
+ # Process skills property using data from Skill.get_all instead of agent_schema.json
1470
1470
  skills_property = schema.get("properties", {}).get("skills", {})
1471
- skills_properties = skills_property.get("properties", {})
1472
1471
 
1473
- if skills_properties:
1474
- skill_states_map: dict[str, dict[str, Skill]] = {}
1472
+ # Build skill_states_map from database
1473
+ skill_states_map: dict[str, dict[str, Skill]] = {}
1474
+ for skill_model in await Skill.get_all(db):
1475
+ if not skill_model.config_name:
1476
+ continue
1477
+ category_states = skill_states_map.setdefault(skill_model.category, {})
1478
+ if skill_model.enabled:
1479
+ category_states[skill_model.config_name] = skill_model
1480
+ else:
1481
+ category_states.pop(skill_model.config_name, None)
1475
1482
 
1476
- for skill_model in await Skill.get_all(db):
1477
- if not skill_model.config_name:
1478
- continue
1479
- category_states = skill_states_map.setdefault(
1480
- skill_model.category, {}
1481
- )
1482
- if skill_model.enabled:
1483
- category_states[skill_model.config_name] = skill_model
1484
- else:
1485
- category_states.pop(skill_model.config_name, None)
1483
+ enabled_categories = {
1484
+ category for category, states in skill_states_map.items() if states
1485
+ }
1486
1486
 
1487
- enabled_categories = {
1488
- category for category, states in skill_states_map.items() if states
1487
+ # Calculate price levels and skills data
1488
+ category_avg_price_levels = {}
1489
+ skills_data = {}
1490
+ for category, states in skill_states_map.items():
1491
+ if not states:
1492
+ continue
1493
+ price_levels = [
1494
+ state.price_level
1495
+ for state in states.values()
1496
+ if state.price_level is not None
1497
+ ]
1498
+ if price_levels:
1499
+ category_avg_price_levels[category] = int(
1500
+ sum(price_levels) / len(price_levels)
1501
+ )
1502
+ skills_data[category] = {
1503
+ config_name: state.price_level
1504
+ for config_name, state in states.items()
1489
1505
  }
1490
1506
 
1491
- category_avg_price_levels = {}
1492
- skills_data = {}
1493
- for category, states in skill_states_map.items():
1494
- if not states:
1495
- continue
1496
- price_levels = [
1497
- state.price_level
1498
- for state in states.values()
1499
- if state.price_level is not None
1500
- ]
1501
- if price_levels:
1502
- category_avg_price_levels[category] = int(
1503
- sum(price_levels) / len(price_levels)
1504
- )
1505
- skills_data[category] = {
1506
- config_name: state.price_level
1507
- for config_name, state in states.items()
1508
- }
1507
+ # Dynamically generate skills_properties from Skill.get_all data
1508
+ skills_properties = {}
1509
+ current_dir = Path(__file__).parent
1510
+
1511
+ for category in enabled_categories:
1512
+ # Skip if filtered for auto-generation
1513
+ skill_schema_path = current_dir / f"../skills/{category}/schema.json"
1514
+ if skill_schema_path.exists():
1515
+ try:
1516
+ with open(skill_schema_path) as f:
1517
+ skill_schema = json.load(f)
1518
+
1519
+ # Check if this skill should be filtered for owner API requirements
1520
+ if filter_owner_api_skills and cls._is_agent_owner_only_skill(
1521
+ skill_schema
1522
+ ):
1523
+ logger.info(
1524
+ f"Filtered out skill '{category}' from auto-generation: requires agent owner API key"
1525
+ )
1526
+ continue
1527
+
1528
+ # Create skill property with embedded schema instead of reference
1529
+ # Load and embed the full skill schema directly
1530
+ base_uri = f"file://{skill_schema_path}"
1531
+ with open(skill_schema_path) as f:
1532
+ embedded_skill_schema = jsonref.load(
1533
+ f, base_uri=base_uri, proxies=False, lazy_load=False
1534
+ )
1509
1535
 
1510
- skill_keys = list(skills_properties.keys())
1511
-
1512
- for skill_category in skill_keys:
1513
- if skill_category not in enabled_categories:
1514
- skills_properties.pop(skill_category, None)
1515
- elif filter_owner_api_skills and cls._is_agent_owner_only_skill(
1516
- skills_properties[skill_category]
1517
- ):
1518
- skills_properties.pop(skill_category, None)
1519
- logger.info(
1520
- f"Filtered out skill '{skill_category}' from auto-generation: requires agent owner API key"
1521
- )
1522
- else:
1523
- if skill_category in category_avg_price_levels:
1524
- skills_properties[skill_category]["x-avg-price-level"] = (
1525
- category_avg_price_levels[skill_category]
1536
+ skills_properties[category] = {
1537
+ "title": skill_schema.get("title", category.title()),
1538
+ **embedded_skill_schema, # Embed the full schema instead of using $ref
1539
+ }
1540
+
1541
+ # Add price level information
1542
+ if category in category_avg_price_levels:
1543
+ skills_properties[category]["x-avg-price-level"] = (
1544
+ category_avg_price_levels[category]
1526
1545
  )
1527
1546
 
1528
- if skill_category in skills_data:
1547
+ if category in skills_data:
1548
+ # Add price level to states in the embedded schema
1529
1549
  skill_states = (
1530
- skills_properties[skill_category]
1550
+ skills_properties[category]
1531
1551
  .get("properties", {})
1532
1552
  .get("states", {})
1533
1553
  .get("properties", {})
1534
1554
  )
1535
1555
  for state_name, state_config in skill_states.items():
1536
1556
  if (
1537
- state_name in skills_data[skill_category]
1538
- and skills_data[skill_category][state_name]
1539
- is not None
1557
+ state_name in skills_data[category]
1558
+ and skills_data[category][state_name] is not None
1540
1559
  ):
1541
1560
  state_config["x-price-level"] = skills_data[
1542
- skill_category
1561
+ category
1543
1562
  ][state_name]
1563
+ except (FileNotFoundError, json.JSONDecodeError) as e:
1564
+ logger.warning(
1565
+ f"Could not load schema for skill category '{category}': {e}"
1566
+ )
1567
+ continue
1568
+
1569
+ # Update the skills property in the schema
1570
+ if skills_property:
1571
+ skills_property["properties"] = skills_properties
1544
1572
 
1545
1573
  # Log the changes for debugging
1546
1574
  logger.debug(
@@ -321,152 +321,7 @@
321
321
  "description": "Dict of skills and their corresponding configurations",
322
322
  "x-group": "skills",
323
323
  "x-inline": true,
324
- "properties": {
325
- "allora": {
326
- "title": "Allora",
327
- "$ref": "../skills/allora/schema.json"
328
- },
329
- "cdp": {
330
- "title": "Coinbase Wallet",
331
- "$ref": "../skills/cdp/schema.json"
332
- },
333
- "dapplooker": {
334
- "title": "DappLooker",
335
- "$ref": "../skills/dapplooker/schema.json"
336
- },
337
- "elfa": {
338
- "title": "Elfa",
339
- "$ref": "../skills/elfa/schema.json"
340
- },
341
- "openai": {
342
- "title": "OpenAI",
343
- "$ref": "../skills/openai/schema.json"
344
- },
345
- "portfolio": {
346
- "title": "Blockchain Portfolio",
347
- "$ref": "../skills/portfolio/schema.json"
348
- },
349
- "tavily": {
350
- "title": "Tavily",
351
- "$ref": "../skills/tavily/schema.json"
352
- },
353
- "token": {
354
- "title": "Token Operations",
355
- "$ref": "../skills/token/schema.json"
356
- },
357
- "twitter": {
358
- "title": "X",
359
- "$ref": "../skills/twitter/schema.json"
360
- },
361
- "xmtp": {
362
- "title": "XMTP",
363
- "$ref": "../skills/xmtp/schema.json"
364
- },
365
- "chainlist": {
366
- "title": "Chainlist RPC Endpoints",
367
- "$ref": "../skills/chainlist/schema.json"
368
- },
369
- "dexscreener": {
370
- "title": "DEX Screener",
371
- "$ref": "../skills/dexscreener/schema.json"
372
- },
373
- "heurist": {
374
- "title": "Heurist",
375
- "$ref": "../skills/heurist/schema.json"
376
- },
377
- "nation": {
378
- "title": "Nation",
379
- "$ref": "../skills/nation/schema.json"
380
- },
381
- "defillama": {
382
- "title": "Defillama",
383
- "$ref": "../skills/defillama/schema.json"
384
- },
385
- "enso": {
386
- "title": "Enso",
387
- "$ref": "../skills/enso/schema.json"
388
- },
389
- "common": {
390
- "title": "Common",
391
- "$ref": "../skills/common/schema.json"
392
- },
393
- "github": {
394
- "title": "GitHub",
395
- "$ref": "../skills/github/schema.json"
396
- },
397
- "moralis": {
398
- "title": "Moralis",
399
- "$ref": "../skills/moralis/schema.json"
400
- },
401
- "system": {
402
- "title": "System",
403
- "$ref": "../skills/system/schema.json"
404
- },
405
- "http": {
406
- "title": "HTTP Client",
407
- "$ref": "../skills/http/schema.json"
408
- },
409
- "web_scraper": {
410
- "title": "Web Scraper & Content Indexing",
411
- "$ref": "../skills/web_scraper/schema.json"
412
- },
413
- "firecrawl": {
414
- "title": "Firecrawl Web Scraping",
415
- "$ref": "../skills/firecrawl/schema.json"
416
- },
417
- "aixbt": {
418
- "title": "AIXBT",
419
- "$ref": "../skills/aixbt/schema.json"
420
- },
421
- "cookiefun": {
422
- "title": "cookie.fun",
423
- "$ref": "../skills/cookiefun/schema.json"
424
- },
425
- "cryptocompare": {
426
- "title": "Cryptocompare",
427
- "$ref": "../skills/cryptocompare/schema.json"
428
- },
429
- "cryptopanic": {
430
- "title": "CryptoPanic",
431
- "$ref": "../skills/cryptopanic/schema.json"
432
- },
433
- "dune_analytics": {
434
- "title": "Dune Analytics",
435
- "$ref": "../skills/dune_analytics/schema.json"
436
- },
437
- "slack": {
438
- "title": "Slack",
439
- "$ref": "../skills/slack/schema.json"
440
- },
441
- "supabase": {
442
- "title": "Supabase",
443
- "$ref": "../skills/supabase/schema.json"
444
- },
445
- "venice_audio": {
446
- "title": "Venice Audio",
447
- "$ref": "../skills/venice_audio/schema.json"
448
- },
449
- "venice_image": {
450
- "title": "Venice Image",
451
- "$ref": "../skills/venice_image/schema.json"
452
- },
453
- "unrealspeech": {
454
- "title": "UnrealSpeech",
455
- "$ref": "../skills/unrealspeech/schema.json"
456
- },
457
- "carv": {
458
- "title": "Carv",
459
- "$ref": "../skills/carv/schema.json"
460
- },
461
- "lifi": {
462
- "title": "LiFi",
463
- "$ref": "../skills/lifi/schema.json"
464
- },
465
- "casino": {
466
- "title": "Casino",
467
- "$ref": "../skills/casino/schema.json"
468
- }
469
- }
324
+ "properties": {}
470
325
  },
471
326
  "autonomous": {
472
327
  "title": "Autonomous",
intentkit/models/llm.csv CHANGED
@@ -1,4 +1,9 @@
1
1
  id,name,provider,enabled,input_price,output_price,price_level,context_length,output_length,intelligence,speed,supports_image_input,supports_skill_calls,supports_structured_output,has_reasoning,supports_search,supports_temperature,supports_frequency_penalty,supports_presence_penalty,api_base,timeout
2
+ qwen/qwen3-235b-a22b-2507,Qwen3 235B A22B Instruct 2507,gatewayz,TRUE,0.1,0.6,1,262000,262000,4,2,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
3
+ google/gemini-2.5-flash,Gemini 2.5 Flash,gatewayz,TRUE,0.3,2.5,2,1050000,65000,4,2,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
4
+ x-ai/grok-4-fast:free,Grok 4 Fast,gatewayz,TRUE,0.2,0.5,1,128000,30000,4,2,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
5
+ x-ai/grok-code-fast-1,Grok Code Fast 1,gatewayz,TRUE,3,15,5,200000,64000,5,1,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
6
+ anthropic/claude-sonnet-4,Anthropic Claude Sonnet 4,gatewayz,TRUE,3,15,5,200000,64000,5,1,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
2
7
  gpt-4o,GPT-4o,openai,FALSE,2.5,10,4,128000,4096,4,3,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
3
8
  gpt-4o-mini,GPT-4o Mini,openai,FALSE,0.15,0.6,1,128000,4096,3,4,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
4
9
  gpt-4.1-nano,GPT-4.1 Nano,openai,TRUE,0.1,0.4,1,128000,4096,3,5,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,,180
intentkit/models/llm.py CHANGED
@@ -95,6 +95,7 @@ class LLMProvider(str, Enum):
95
95
  OPENAI = "openai"
96
96
  DEEPSEEK = "deepseek"
97
97
  XAI = "xai"
98
+ GATEWAYZ = "gatewayz"
98
99
  ETERNAL = "eternal"
99
100
  REIGENT = "reigent"
100
101
  VENICE = "venice"
@@ -105,9 +106,10 @@ class LLMProvider(str, Enum):
105
106
  self.OPENAI: "OpenAI",
106
107
  self.DEEPSEEK: "DeepSeek",
107
108
  self.XAI: "xAI",
108
- self.ETERNAL: "Others",
109
- self.REIGENT: "Others",
110
- self.VENICE: "Others",
109
+ self.GATEWAYZ: "Gatewayz",
110
+ self.ETERNAL: "Eternal",
111
+ self.REIGENT: "Reigent",
112
+ self.VENICE: "Venice",
111
113
  }
112
114
  return display_names.get(self, self.value)
113
115
 
@@ -462,6 +464,35 @@ class XAILLM(LLMModel):
462
464
  return ChatXAI(**kwargs)
463
465
 
464
466
 
467
+ class GatewayzLLM(LLMModel):
468
+ """Gatewayz AI LLM configuration."""
469
+
470
+ async def create_instance(self, config: Any) -> BaseChatModel:
471
+ """Create and return a ChatOpenAI instance configured for Eternal AI."""
472
+ from langchain_openai import ChatOpenAI
473
+
474
+ info = await self.model_info()
475
+
476
+ kwargs = {
477
+ "model": self.model_name,
478
+ "api_key": config.gatewayz_api_key,
479
+ "base_url": info.api_base,
480
+ "timeout": info.timeout,
481
+ }
482
+
483
+ # Add optional parameters based on model support
484
+ if info.supports_temperature:
485
+ kwargs["temperature"] = self.temperature
486
+
487
+ if info.supports_frequency_penalty:
488
+ kwargs["frequency_penalty"] = self.frequency_penalty
489
+
490
+ if info.supports_presence_penalty:
491
+ kwargs["presence_penalty"] = self.presence_penalty
492
+
493
+ return ChatOpenAI(**kwargs)
494
+
495
+
465
496
  class EternalLLM(LLMModel):
466
497
  """Eternal AI LLM configuration."""
467
498
 
@@ -575,6 +606,8 @@ async def create_llm_model(
575
606
  return ReigentLLM(**base_params)
576
607
  elif provider == LLMProvider.VENICE:
577
608
  return VeniceLLM(**base_params)
609
+ elif provider == LLMProvider.GATEWAYZ:
610
+ return GatewayzLLM(**base_params)
578
611
  else:
579
612
  # Default to OpenAI
580
613
  return OpenAILLM(**base_params)
@@ -5,8 +5,9 @@
5
5
  "description": "Integration with Acolyt Oracle providing blockchain oracle services for accessing and verifying off-chain data with secure API connections",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/acolyt/acolyt.jpg",
7
7
  "x-tags": [
8
- "Blockchain",
9
- "Oracle"
8
+ "Analytics",
9
+ "Crypto",
10
+ "DeFi"
10
11
  ],
11
12
  "properties": {
12
13
  "enabled": {
@@ -86,4 +87,4 @@
86
87
  }
87
88
  },
88
89
  "additionalProperties": true
89
- }
90
+ }
@@ -5,9 +5,9 @@
5
5
  "description": "Cryptocurrency project data and analytics through the AIXBT API",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/aixbt/aixbt.jpg",
7
7
  "x-tags": [
8
- "Cryptocurrency",
9
- "Research",
10
- "Analytics"
8
+ "Analytics",
9
+ "Crypto",
10
+ "Knowledge Base"
11
11
  ],
12
12
  "properties": {
13
13
  "enabled": {
@@ -96,4 +96,4 @@
96
96
  }
97
97
  },
98
98
  "additionalProperties": true
99
- }
99
+ }
@@ -5,7 +5,8 @@
5
5
  "description": "Integration with Allora API for blockchain-based price predictions and market forecasting services via Upshot's prediction markets",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/allora/allora.jpeg",
7
7
  "x-tags": [
8
- "Blockchain"
8
+ "Analytics",
9
+ "Crypto"
9
10
  ],
10
11
  "properties": {
11
12
  "enabled": {
@@ -86,4 +87,4 @@
86
87
  }
87
88
  },
88
89
  "additionalProperties": true
89
- }
90
+ }
@@ -5,7 +5,8 @@
5
5
  "description": "Basename ENS-style name registration via Coinbase AgentKit",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/basename/basename.svg",
7
7
  "x-tags": [
8
- "Blockchain"
8
+ "Crypto",
9
+ "Identity"
9
10
  ],
10
11
  "properties": {
11
12
  "enabled": {