SixpertK2 / examples /function_calling.py
SixpertAI's picture
Upload examples/function_calling.py with huggingface_hub
f97fae3 verified
Raw
History Blame Contribute Delete
6.73 kB
#!/usr/bin/env python3
"""
Sixpert K2 - Function Calling Agent Example
============================================
Demonstrates how to use Sixpert K2's function calling capabilities
in an agentic loop. K2's MoE architecture provides specialized experts
for tool selection and argument formatting.
Usage:
python function_calling.py
"""
import json
import sys
try:
from llama_cpp import Llama
except ImportError:
print("Installing llama-cpp-python...")
import subprocess
subprocess.check_call([sys.executable, "-m", "pip", "install", "llama-cpp-python"])
from llama_cpp import Llama
TOOLS = [
{
"type": "function",
"function": {
"name": "search_research_papers",
"description": "Search for academic research papers on a topic",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Research topic"},
"year_from": {"type": "integer", "description": "Start year"},
"max_results": {"type": "integer", "default": 10},
},
"required": ["query"],
},
},
},
{
"type": "function",
"function": {
"name": "run_python_code",
"description": "Execute Python code in a sandboxed environment",
"parameters": {
"type": "object",
"properties": {
"code": {"type": "string", "description": "Python code to execute"},
"timeout": {"type": "integer", "description": "Timeout in seconds", "default": 30},
},
"required": ["code"],
},
},
},
{
"type": "function",
"function": {
"name": "analyze_data",
"description": "Analyze a dataset and provide statistical insights",
"parameters": {
"type": "object",
"properties": {
"data_description": {"type": "string", "description": "Description of the data"},
"analysis_type": {"type": "string", "enum": ["descriptive", "inferential", "predictive"], "description": "Type of analysis"},
},
"required": ["data_description", "analysis_type"],
},
},
},
{
"type": "function",
"function": {
"name": "calculate_math",
"description": "Perform mathematical calculations",
"parameters": {
"type": "object",
"properties": {
"expression": {"type": "string", "description": "Mathematical expression"},
"precision": {"type": "integer", "description": "Decimal places", "default": 6},
},
"required": ["expression"],
},
},
},
]
def mock_execute_tool(tool_call: dict) -> str:
"""Mock execution of a tool call. Replace with real implementations."""
name = tool_call["function"]["name"]
args = json.loads(tool_call["function"]["arguments"])
print(f" Tool call: {name}({json.dumps(args, indent=2)})")
if name == "search_research_papers":
return json.dumps({
"papers": [
{"title": f"Advances in {args['query']}", "year": 2025, "citations": 42},
{"title": f"Survey of {args['query']} Methods", "year": 2024, "citations": 128},
],
"total_found": 1247,
})
elif name == "run_python_code":
return json.dumps({"stdout": "42", "stderr": "", "exit_code": 0})
elif name == "analyze_data":
return json.dumps({
"summary": "Dataset shows normal distribution with mean=0.0, std=1.0",
"insights": ["No significant outliers detected", "Data is well-scaled"],
})
elif name == "calculate_math":
return json.dumps({"result": 3.141593, "expression": args["expression"]})
return json.dumps({"error": f"Unknown tool: {name}"})
def run_agent(model_path: str, user_query: str, max_turns: int = 5):
"""Run an agentic loop with function calling."""
print(f"\nUser Query: {user_query}")
print("-" * 50)
llm = Llama(
model_path=model_path,
n_ctx=16384,
n_gpu_layers=-1,
verbose=False,
)
messages = [
{
"role": "system",
"content": (
"You are Sixpert K2, a deep reasoning engine with advanced "
"agentic capabilities. When the user asks a question that "
"requires external tools, use the available functions. "
"Think step-by-step and plan your approach before calling tools. "
"You can call multiple tools in sequence to solve complex problems."
),
},
{"role": "user", "content": user_query},
]
for turn in range(max_turns):
print(f"\n--- Turn {turn + 1} ---")
response = llm.create_chat_completion(
messages=messages,
tools=TOOLS,
tool_choice="auto",
temperature=0.6,
stream=False,
)
choice = response["choices"][0]
message = choice["message"]
if message.get("tool_calls"):
for tool_call in message["tool_calls"]:
print(f" Tool call: {tool_call['function']['name']}")
tool_result = mock_execute_tool(tool_call)
print(f" Result: {tool_result[:150]}...")
messages.append({
"role": "assistant",
"content": None,
"tool_calls": [tool_call],
})
messages.append({
"role": "tool",
"tool_call_id": tool_call["id"],
"content": tool_result,
})
else:
print(f"\nSixpert K2: {message['content']}")
break
else:
print("\nReached maximum turns.")
def main():
import argparse
parser = argparse.ArgumentParser(description="Sixpert K2 Function Calling")
parser.add_argument("--model", type=str, default="SixpertK2.gguf", help="Path to GGUF model")
parser.add_argument("--query", type=str, default="Calculate pi to 6 decimal places and search for research on numerical methods", help="User query")
args = parser.parse_args()
print("=" * 60)
print(" Sixpert K2 - Function Calling Agent")
print(" MoE Architecture | Deep Reasoning")
print("=" * 60)
run_agent(args.model, args.query)
if __name__ == "__main__":
main()