Agent-JAE/default-skills/venice-list-text-models/scripts/list_text_models.py
jae 7fe886fea5
Some checks are pending
CI / build-check-test (push) Waiting to run
feat: add 11 Venice AI skills as bundled defaults
Skills included:
- venice-chat: Chat with Venice LLM models, vision, reasoning
- venice-chat-benchmark: Benchmark chat models with infographics
- venice-image-gen: Generate images via Venice API
- venice-list-image-models: List available image models
- venice-list-text-models: List available text models
- venice-list-video-models: List available video models
- venice-tts: Text-to-speech via Venice API
- venice-video-generate: Generate videos from text/images
- venice-video-queue: Queue video generation jobs
- venice-video-quote: Get video generation cost quotes
- venice-video-retrieve: Retrieve completed videos

All rebranded from Agent Zero paths to Agent JAE (~/.jae/agent/skills/).
Requires VENICE_API_KEY environment variable.
2026-03-23 18:47:33 +01:00

146 lines
4.4 KiB
Python

"""# Venice.ai List Text Models Instrument
List available text/LLM models from Venice.ai API.
Returns model names, capabilities, context windows, and pricing.
Usage: list_text_models(filter_trait=None) - optionally filter by trait like "most_intelligent", "default"
"""
import os
import requests
from typing import Optional
from pydantic import BaseModel, Field
# API Configuration
VENICE_API_URL = "https://api.venice.ai/api/v1/models"
VENICE_API_KEY = os.getenv("VENICE_API_KEY")
# Pydantic Models
class PricePoint(BaseModel):
usd: float
diem: float
class Pricing(BaseModel):
input: PricePoint
output: PricePoint
cache_input: Optional[PricePoint] = None
class Capabilities(BaseModel):
optimizedForCode: bool = False
quantization: Optional[str] = None
supportsAudioInput: bool = False
supportsFunctionCalling: bool = False
supportsLogProbs: bool = False
supportsReasoning: bool = False
supportsResponseSchema: bool = False
supportsVideoInput: bool = False
supportsVision: bool = False
supportsWebSearch: bool = False
class ParameterConstraint(BaseModel):
default: float
class Constraints(BaseModel):
temperature: Optional[ParameterConstraint] = None
top_p: Optional[ParameterConstraint] = None
class TextModelSpec(BaseModel):
pricing: Pricing
availableContextTokens: int
capabilities: Capabilities
constraints: Optional[Constraints] = None
description: str = ""
name: str
modelSource: Optional[str] = None
offline: bool = False
privacy: str = "private"
traits: list[str] = Field(default_factory=list)
class TextModel(BaseModel):
created: int
id: str
model_spec: TextModelSpec
object: str = "model"
owned_by: str = ""
type: str = "text"
class TextModelsResponse(BaseModel):
data: list[TextModel]
object: str = "list"
type: str = "text"
def list_text_models(filter_trait: Optional[str] = None) -> TextModelsResponse:
"""
Fetch text models from Venice.ai API.
Args:
filter_trait: Optional trait to filter by (e.g., "most_intelligent", "default", "most_uncensored")
Returns:
TextModelsResponse with list of available text models
"""
headers = {
"Authorization": f"Bearer {VENICE_API_KEY}",
"Content-Type": "application/json"
}
params = {"type": "text"}
response = requests.get(VENICE_API_URL, headers=headers, params=params, timeout=30)
response.raise_for_status()
data = response.json()
result = TextModelsResponse(**data)
if filter_trait:
result.data = [m for m in result.data if filter_trait in m.model_spec.traits]
return result
def format_models_table(models: TextModelsResponse) -> str:
"""Format models as a readable table."""
lines = []
lines.append(f"{'Model ID':<35} {'Name':<30} {'Context':<10} {'In $/M':<8} {'Out $/M':<8} {'Traits'}")
lines.append("-" * 120)
for m in sorted(models.data, key=lambda x: x.model_spec.availableContextTokens, reverse=True):
spec = m.model_spec
ctx = f"{spec.availableContextTokens // 1024}K"
traits = ", ".join(spec.traits) if spec.traits else "-"
lines.append(
f"{m.id:<35} {spec.name:<30} {ctx:<10} {spec.pricing.input.usd:<8.2f} {spec.pricing.output.usd:<8.2f} {traits}"
)
return "\n".join(lines)
def get_capabilities_summary(models: TextModelsResponse) -> dict:
"""Summarize capabilities across all models."""
summary = {
"total": len(models.data),
"with_reasoning": 0,
"with_vision": 0,
"with_function_calling": 0,
"with_web_search": 0,
"optimized_for_code": 0
}
for m in models.data:
cap = m.model_spec.capabilities
if cap.supportsReasoning: summary["with_reasoning"] += 1
if cap.supportsVision: summary["with_vision"] += 1
if cap.supportsFunctionCalling: summary["with_function_calling"] += 1
if cap.supportsWebSearch: summary["with_web_search"] += 1
if cap.optimizedForCode: summary["optimized_for_code"] += 1
return summary
if __name__ == "__main__":
print("Fetching Venice.ai text models...\n")
models = list_text_models()
print(f"Total text models available: {len(models.data)}\n")
print(format_models_table(models))
print("\n=== Capabilities Summary ===")
summary = get_capabilities_summary(models)
for key, val in summary.items():
print(f" {key}: {val}")