Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.3.0-alpha.3"
".": "0.3.0-alpha.4"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 109
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/llamastack%2Fllama-stack-client-4337a6181c2db17737133e944b4b660a5e00ea10dce6be3252918e39451e9b5f.yml
openapi_spec_hash: a0bc8f4b5f45bc5741fed8eaa61171c3
config_hash: 0412cd40c0609550c1a47c69dd104e4f
configured_endpoints: 108
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/llamastack%2Fllama-stack-client-b220f9f8667d2af8007134d0403b24452c20c9c512ca87d0b69b20b761272609.yml
openapi_spec_hash: cde1096a830f2081d68f858f020fd53f
config_hash: 8800bdff1a087b9d5211dda2a7b9f66f
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# Changelog

## 0.3.0-alpha.4 (2025-10-02)

Full Changelog: [v0.3.0-alpha.3...v0.3.0-alpha.4](https://github.com/llamastack/llama-stack-client-python/compare/v0.3.0-alpha.3...v0.3.0-alpha.4)

### ⚠ BREAKING CHANGES

* **api:** use input_schema instead of parameters for tools

### Features

* **api:** fixes to URLs ([406c366](https://github.com/llamastack/llama-stack-client-python/commit/406c36699f5618b0d2673ab38c93516aa403778f))
* **api:** tool api (input_schema, etc.) changes ([064b98b](https://github.com/llamastack/llama-stack-client-python/commit/064b98bb38a87ee2c9deb93344409216a389aecd))
* **api:** use input_schema instead of parameters for tools ([2d53df4](https://github.com/llamastack/llama-stack-client-python/commit/2d53df4f8b44af56019571e4b2db9ab875fb13d3))


### Bug Fixes

* **api:** another fix to capture correct responses.create() params ([a41fdb1](https://github.com/llamastack/llama-stack-client-python/commit/a41fdb1089f180f612e4fee2204217099c1dddd0))
* **api:** fix the ToolDefParam updates ([4e24a76](https://github.com/llamastack/llama-stack-client-python/commit/4e24a76a0065b5ebea99a5792389ce9aa0fe7483))
* **manual:** kill arguments_json ([a05eb61](https://github.com/llamastack/llama-stack-client-python/commit/a05eb6194fd7234420e6237cd34b84d2c859f525))
* **manual:** update lib/ code for the input_schema changes ([67b3d02](https://github.com/llamastack/llama-stack-client-python/commit/67b3d02467b6cb12d606d0626bbc2b52ae767885))
* **manual:** use tool.name instead of tool.identifier ([8542d1d](https://github.com/llamastack/llama-stack-client-python/commit/8542d1d2aaff782091ac5dc8c8dac59a0d1a5fa6))

## 0.3.0-alpha.3 (2025-09-30)

Full Changelog: [v0.3.0-alpha.2...v0.3.0-alpha.3](https://github.com/llamastack/llama-stack-client-python/compare/v0.3.0-alpha.2...v0.3.0-alpha.3)
Expand Down
37 changes: 18 additions & 19 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ Methods:
Types:

```python
from llama_stack_client.types import ListToolsResponse, Tool, ToolListResponse
from llama_stack_client.types import ToolListResponse
```

Methods:

- <code title="get /v1/tools">client.tools.<a href="./src/llama_stack_client/resources/tools.py">list</a>(\*\*<a href="src/llama_stack_client/types/tool_list_params.py">params</a>) -> <a href="./src/llama_stack_client/types/tool_list_response.py">ToolListResponse</a></code>
- <code title="get /v1/tools/{tool_name}">client.tools.<a href="./src/llama_stack_client/resources/tools.py">get</a>(tool_name) -> <a href="./src/llama_stack_client/types/tool.py">Tool</a></code>
- <code title="get /v1/tools/{tool_name}">client.tools.<a href="./src/llama_stack_client/resources/tools.py">get</a>(tool_name) -> <a href="./src/llama_stack_client/types/tool_def.py">ToolDef</a></code>

# ToolRuntime

Expand Down Expand Up @@ -118,12 +118,12 @@ from llama_stack_client.types import (

Methods:

- <code title="get /v1/datasets/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">retrieve</a>(dataset_id) -> <a href="./src/llama_stack_client/types/dataset_retrieve_response.py">DatasetRetrieveResponse</a></code>
- <code title="get /v1/datasets">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">list</a>() -> <a href="./src/llama_stack_client/types/dataset_list_response.py">DatasetListResponse</a></code>
- <code title="post /v1/datasetio/append-rows/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">appendrows</a>(dataset_id, \*\*<a href="src/llama_stack_client/types/dataset_appendrows_params.py">params</a>) -> None</code>
- <code title="get /v1/datasetio/iterrows/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">iterrows</a>(dataset_id, \*\*<a href="src/llama_stack_client/types/dataset_iterrows_params.py">params</a>) -> <a href="./src/llama_stack_client/types/dataset_iterrows_response.py">DatasetIterrowsResponse</a></code>
- <code title="post /v1/datasets">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">register</a>(\*\*<a href="src/llama_stack_client/types/dataset_register_params.py">params</a>) -> <a href="./src/llama_stack_client/types/dataset_register_response.py">DatasetRegisterResponse</a></code>
- <code title="delete /v1/datasets/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">unregister</a>(dataset_id) -> None</code>
- <code title="get /v1beta/datasets/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">retrieve</a>(dataset_id) -> <a href="./src/llama_stack_client/types/dataset_retrieve_response.py">DatasetRetrieveResponse</a></code>
- <code title="get /v1beta/datasets">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">list</a>() -> <a href="./src/llama_stack_client/types/dataset_list_response.py">DatasetListResponse</a></code>
- <code title="post /v1beta/datasetio/append-rows/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">appendrows</a>(dataset_id, \*\*<a href="src/llama_stack_client/types/dataset_appendrows_params.py">params</a>) -> None</code>
- <code title="get /v1beta/datasetio/iterrows/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">iterrows</a>(dataset_id, \*\*<a href="src/llama_stack_client/types/dataset_iterrows_params.py">params</a>) -> <a href="./src/llama_stack_client/types/dataset_iterrows_response.py">DatasetIterrowsResponse</a></code>
- <code title="post /v1beta/datasets">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">register</a>(\*\*<a href="src/llama_stack_client/types/dataset_register_params.py">params</a>) -> <a href="./src/llama_stack_client/types/dataset_register_response.py">DatasetRegisterResponse</a></code>
- <code title="delete /v1beta/datasets/{dataset_id}">client.datasets.<a href="./src/llama_stack_client/resources/datasets.py">unregister</a>(dataset_id) -> None</code>

# Inspect

Expand Down Expand Up @@ -406,14 +406,13 @@ from llama_stack_client.types import (

Methods:

- <code title="get /v1/telemetry/traces/{trace_id}/spans/{span_id}">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">get_span</a>(span_id, \*, trace_id) -> <a href="./src/llama_stack_client/types/telemetry_get_span_response.py">TelemetryGetSpanResponse</a></code>
- <code title="post /v1/telemetry/spans/{span_id}/tree">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">get_span_tree</a>(span_id, \*\*<a href="src/llama_stack_client/types/telemetry_get_span_tree_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_get_span_tree_response.py">TelemetryGetSpanTreeResponse</a></code>
- <code title="get /v1/telemetry/traces/{trace_id}">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">get_trace</a>(trace_id) -> <a href="./src/llama_stack_client/types/trace.py">Trace</a></code>
- <code title="post /v1/telemetry/events">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">log_event</a>(\*\*<a href="src/llama_stack_client/types/telemetry_log_event_params.py">params</a>) -> None</code>
- <code title="post /v1/telemetry/metrics/{metric_name}">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">query_metrics</a>(metric_name, \*\*<a href="src/llama_stack_client/types/telemetry_query_metrics_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_query_metrics_response.py">TelemetryQueryMetricsResponse</a></code>
- <code title="post /v1/telemetry/spans">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">query_spans</a>(\*\*<a href="src/llama_stack_client/types/telemetry_query_spans_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_query_spans_response.py">TelemetryQuerySpansResponse</a></code>
- <code title="post /v1/telemetry/traces">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">query_traces</a>(\*\*<a href="src/llama_stack_client/types/telemetry_query_traces_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_query_traces_response.py">TelemetryQueryTracesResponse</a></code>
- <code title="post /v1/telemetry/spans/export">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">save_spans_to_dataset</a>(\*\*<a href="src/llama_stack_client/types/telemetry_save_spans_to_dataset_params.py">params</a>) -> None</code>
- <code title="get /v1alpha/telemetry/traces/{trace_id}/spans/{span_id}">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">get_span</a>(span_id, \*, trace_id) -> <a href="./src/llama_stack_client/types/telemetry_get_span_response.py">TelemetryGetSpanResponse</a></code>
- <code title="post /v1alpha/telemetry/spans/{span_id}/tree">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">get_span_tree</a>(span_id, \*\*<a href="src/llama_stack_client/types/telemetry_get_span_tree_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_get_span_tree_response.py">TelemetryGetSpanTreeResponse</a></code>
- <code title="get /v1alpha/telemetry/traces/{trace_id}">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">get_trace</a>(trace_id) -> <a href="./src/llama_stack_client/types/trace.py">Trace</a></code>
- <code title="post /v1alpha/telemetry/metrics/{metric_name}">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">query_metrics</a>(metric_name, \*\*<a href="src/llama_stack_client/types/telemetry_query_metrics_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_query_metrics_response.py">TelemetryQueryMetricsResponse</a></code>
- <code title="post /v1alpha/telemetry/spans">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">query_spans</a>(\*\*<a href="src/llama_stack_client/types/telemetry_query_spans_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_query_spans_response.py">TelemetryQuerySpansResponse</a></code>
- <code title="post /v1alpha/telemetry/traces">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">query_traces</a>(\*\*<a href="src/llama_stack_client/types/telemetry_query_traces_params.py">params</a>) -> <a href="./src/llama_stack_client/types/telemetry_query_traces_response.py">TelemetryQueryTracesResponse</a></code>
- <code title="post /v1alpha/telemetry/spans/export">client.telemetry.<a href="./src/llama_stack_client/resources/telemetry.py">save_spans_to_dataset</a>(\*\*<a href="src/llama_stack_client/types/telemetry_save_spans_to_dataset_params.py">params</a>) -> None</code>

# Scoring

Expand Down Expand Up @@ -457,9 +456,9 @@ from llama_stack_client.types import Benchmark, ListBenchmarksResponse, Benchmar

Methods:

- <code title="get /v1/eval/benchmarks/{benchmark_id}">client.benchmarks.<a href="./src/llama_stack_client/resources/benchmarks.py">retrieve</a>(benchmark_id) -> <a href="./src/llama_stack_client/types/benchmark.py">Benchmark</a></code>
- <code title="get /v1/eval/benchmarks">client.benchmarks.<a href="./src/llama_stack_client/resources/benchmarks.py">list</a>() -> <a href="./src/llama_stack_client/types/benchmark_list_response.py">BenchmarkListResponse</a></code>
- <code title="post /v1/eval/benchmarks">client.benchmarks.<a href="./src/llama_stack_client/resources/benchmarks.py">register</a>(\*\*<a href="src/llama_stack_client/types/benchmark_register_params.py">params</a>) -> None</code>
- <code title="get /v1alpha/eval/benchmarks/{benchmark_id}">client.benchmarks.<a href="./src/llama_stack_client/resources/benchmarks.py">retrieve</a>(benchmark_id) -> <a href="./src/llama_stack_client/types/benchmark.py">Benchmark</a></code>
- <code title="get /v1alpha/eval/benchmarks">client.benchmarks.<a href="./src/llama_stack_client/resources/benchmarks.py">list</a>() -> <a href="./src/llama_stack_client/types/benchmark_list_response.py">BenchmarkListResponse</a></code>
- <code title="post /v1alpha/eval/benchmarks">client.benchmarks.<a href="./src/llama_stack_client/resources/benchmarks.py">register</a>(\*\*<a href="src/llama_stack_client/types/benchmark_register_params.py">params</a>) -> None</code>

# Files

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "llama_stack_client"
version = "0.3.0-alpha.3"
version = "0.3.0-alpha.4"
description = "The official Python library for the llama-stack-client API"
dynamic = ["readme"]
license = "MIT"
Expand Down
4 changes: 2 additions & 2 deletions src/llama_stack_client/lib/agents/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ def initialize(self) -> None:
for tg in self.agent_config["toolgroups"]:
toolgroup_id = tg if isinstance(tg, str) else tg.get("name")
for tool in self.client.tools.list(toolgroup_id=toolgroup_id, extra_headers=self.extra_headers):
self.builtin_tools[tool.identifier] = tg.get("args", {}) if isinstance(tg, dict) else {}
self.builtin_tools[tool.name] = tg.get("args", {}) if isinstance(tg, dict) else {}

def create_session(self, session_name: str) -> str:
agentic_system_create_session_response = self.client.alpha.agents.session.create(
Expand Down Expand Up @@ -475,7 +475,7 @@ async def initialize(self) -> None:
self._agent_id = agentic_system_create_response.agent_id
for tg in self.agent_config["toolgroups"]:
for tool in await self.client.tools.list(toolgroup_id=tg, extra_headers=self.extra_headers):
self.builtin_tools[tool.identifier] = tg.get("args", {}) if isinstance(tg, dict) else {}
self.builtin_tools[tool.name] = tg.get("args", {}) if isinstance(tg, dict) else {}

async def create_session(self, session_name: str) -> str:
await self.initialize()
Expand Down
88 changes: 59 additions & 29 deletions src/llama_stack_client/lib/agents/client_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,17 @@
Union,
)

from typing_extensions import TypedDict

from llama_stack_client.types import CompletionMessage, Message
from llama_stack_client.types.alpha import ToolResponse
from llama_stack_client.types.tool_def_param import Parameter, ToolDefParam
from llama_stack_client.types.tool_def_param import ToolDefParam


class JSONSchema(TypedDict, total=False):
type: str
properties: Dict[str, Any]
required: List[str]


class ClientTool:
Expand All @@ -47,28 +55,18 @@ def get_description(self) -> str:
raise NotImplementedError

@abstractmethod
def get_params_definition(self) -> Dict[str, Parameter]:
def get_input_schema(self) -> JSONSchema:
raise NotImplementedError

def get_instruction_string(self) -> str:
return f"Use the function '{self.get_name()}' to: {self.get_description()}"

def parameters_for_system_prompt(self) -> str:
return json.dumps(
{
"name": self.get_name(),
"description": self.get_description(),
"parameters": {name: definition for name, definition in self.get_params_definition().items()},
}
)

def get_tool_definition(self) -> ToolDefParam:
return ToolDefParam(
name=self.get_name(),
description=self.get_description(),
parameters=list(self.get_params_definition().values()),
input_schema=self.get_input_schema(),
metadata={},
tool_prompt_format="python_list",
)

def run(
Expand All @@ -83,12 +81,7 @@ def run(

metadata = {}
try:
if tool_call.arguments_json is not None:
params = json.loads(tool_call.arguments_json)
elif isinstance(tool_call.arguments, str):
params = json.loads(tool_call.arguments)
else:
params = tool_call.arguments
params = json.loads(tool_call.arguments)

response = self.run_impl(**params)
if isinstance(response, dict) and "content" in response:
Expand Down Expand Up @@ -148,6 +141,37 @@ def async_run_impl(self, **kwargs):
T = TypeVar("T", bound=Callable)


def _python_type_to_json_schema_type(type_hint: Any) -> str:
"""Convert Python type hints to JSON Schema type strings."""
# Handle Union types (e.g., Optional[str])
origin = get_origin(type_hint)
if origin is Union:
# Get non-None types from Union
args = [arg for arg in get_args(type_hint) if arg is not type(None)]
if args:
type_hint = args[0] # Use first non-None type

# Get the actual type if it's a generic
if hasattr(type_hint, "__origin__"):
type_hint = type_hint.__origin__

# Map Python types to JSON Schema types
type_name = getattr(type_hint, "__name__", str(type_hint))

type_mapping = {
"bool": "boolean",
"int": "integer",
"float": "number",
"str": "string",
"list": "array",
"dict": "object",
"List": "array",
"Dict": "object",
}

return type_mapping.get(type_name, "string") # Default to string if unknown


def client_tool(func: T) -> ClientTool:
"""
Decorator to convert a function into a ClientTool.
Expand Down Expand Up @@ -188,13 +212,14 @@ def get_description(self) -> str:
f"No description found for client tool {__name__}. Please provide a RST-style docstring with description and :param tags for each parameter."
)

def get_params_definition(self) -> Dict[str, Parameter]:
def get_input_schema(self) -> JSONSchema:
hints = get_type_hints(func)
# Remove return annotation if present
hints.pop("return", None)

# Get parameter descriptions from docstring
params = {}
properties = {}
required = []
sig = inspect.signature(func)
doc = inspect.getdoc(func) or ""

Expand All @@ -212,15 +237,20 @@ def get_params_definition(self) -> Dict[str, Parameter]:
param = sig.parameters[name]
is_optional_type = get_origin(type_hint) is Union and type(None) in get_args(type_hint)
is_required = param.default == inspect.Parameter.empty and not is_optional_type
params[name] = Parameter(
name=name,
description=param_doc or f"Parameter {name}",
parameter_type=type_hint.__name__,
default=(param.default if param.default != inspect.Parameter.empty else None),
required=is_required,
)

return params
properties[name] = {
"type": _python_type_to_json_schema_type(type_hint),
"description": param_doc,
}

if is_required:
required.append(name)

return {
"type": "object",
"properties": properties,
"required": required,
}

def run_impl(self, **kwargs) -> Any:
if inspect.iscoroutinefunction(func):
Expand Down
4 changes: 2 additions & 2 deletions src/llama_stack_client/lib/agents/react/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def get_tool_defs(
{
"name": tool.identifier,
"description": tool.description,
"parameters": tool.parameters,
"input_schema": tool.input_schema,
}
for tool in client.tools.list(toolgroup_id=toolgroup_id)
]
Expand All @@ -48,7 +48,7 @@ def get_tool_defs(
{
"name": tool.get_name(),
"description": tool.get_description(),
"parameters": tool.get_params_definition(),
"input_schema": tool.get_input_schema(),
}
for tool in client_tools
]
Expand Down
Loading
Loading