chore: support new models
This commit is contained in:
+21
@@ -8,3 +8,24 @@ wheels/
|
|||||||
|
|
||||||
# Virtual environments
|
# Virtual environments
|
||||||
.venv
|
.venv
|
||||||
|
|
||||||
|
# Skills
|
||||||
|
.codebuddy/
|
||||||
|
.agent/
|
||||||
|
.agents/
|
||||||
|
.claude/
|
||||||
|
.cursor/
|
||||||
|
.gemini/
|
||||||
|
.github/skills/
|
||||||
|
.github/prompts/
|
||||||
|
.opencode/
|
||||||
|
.qoder/
|
||||||
|
.qwen/
|
||||||
|
.trae/
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
*.env
|
||||||
|
!.example.env
|
||||||
|
!*.env.example
|
||||||
|
|||||||
+4
-4
@@ -3,14 +3,14 @@ name = "llama-agent-skills"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
description = "Add your description here"
|
description = "Add your description here"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
authors = [
|
authors = []
|
||||||
{ name = "Summer Shen", email = "3244742300@qq.com" }
|
|
||||||
]
|
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"llama-index-core>=0.12.0",
|
"llama-index-core>=0.12.0",
|
||||||
"llama-index-llms-openai>=0.3.0",
|
"llama-index-llms-openai>=0.7.5",
|
||||||
"python-frontmatter>=1.1.0",
|
"python-frontmatter>=1.1.0",
|
||||||
|
"python-dotenv>=1.0.0",
|
||||||
|
"llama-index-llms-openai-like>=0.7.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"skills": {
|
||||||
|
"excalidraw-diagram-generator": {
|
||||||
|
"source": "github/awesome-copilot",
|
||||||
|
"sourceType": "github",
|
||||||
|
"computedHash": "e24e3c4cab4b5a07bc1d1801db14868f3a1cd184f7f28f5dd2c4a2b234bf2f2d"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,8 @@ import asyncio
|
|||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
from llama_agent_skills.agent import create_agent, run_agent
|
from llama_agent_skills.agent import create_agent, run_agent
|
||||||
from llama_agent_skills.config import Config
|
from llama_agent_skills.config import Config
|
||||||
from llama_agent_skills.registry import SkillRegistry
|
from llama_agent_skills.registry import SkillRegistry
|
||||||
@@ -29,6 +31,7 @@ async def _run_interactive(config: Config, registry: SkillRegistry) -> None:
|
|||||||
skills=skills,
|
skills=skills,
|
||||||
model=config.llm_model,
|
model=config.llm_model,
|
||||||
api_key=config.llm_api_key,
|
api_key=config.llm_api_key,
|
||||||
|
base_url=config.llm_base_url or None,
|
||||||
base_system_prompt=config.base_system_prompt,
|
base_system_prompt=config.base_system_prompt,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -55,11 +58,13 @@ async def _run_interactive(config: Config, registry: SkillRegistry) -> None:
|
|||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
args = _parse_args()
|
args = _parse_args()
|
||||||
|
load_dotenv()
|
||||||
config = Config.from_env()
|
config = Config.from_env()
|
||||||
|
|
||||||
if args.model:
|
if args.model:
|
||||||
config = Config(
|
config = Config(
|
||||||
llm_api_key=config.llm_api_key,
|
llm_api_key=config.llm_api_key,
|
||||||
|
llm_base_url=config.llm_base_url,
|
||||||
llm_model=args.model,
|
llm_model=args.model,
|
||||||
skill_directories=config.skill_directories,
|
skill_directories=config.skill_directories,
|
||||||
base_system_prompt=config.base_system_prompt,
|
base_system_prompt=config.base_system_prompt,
|
||||||
|
|||||||
@@ -2,11 +2,60 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from typing import Any, Callable
|
from typing import Any, Callable
|
||||||
|
|
||||||
|
import tiktoken
|
||||||
from llama_index.core.agent.workflow import AgentWorkflow
|
from llama_index.core.agent.workflow import AgentWorkflow
|
||||||
|
from llama_index.core.base.llms.types import LLMMetadata
|
||||||
from llama_index.llms.openai import OpenAI
|
from llama_index.llms.openai import OpenAI
|
||||||
|
from llama_index.llms.openai.utils import (
|
||||||
|
CHAT_MODELS,
|
||||||
|
is_chat_model,
|
||||||
|
is_function_calling_model,
|
||||||
|
openai_modelname_to_contextsize,
|
||||||
|
)
|
||||||
|
|
||||||
from llama_agent_skills.skill import Skill
|
from llama_agent_skills.skill import Skill
|
||||||
|
|
||||||
|
_DEFAULT_CONTEXT_WINDOW = 131072
|
||||||
|
_FALLBACK_ENCODING = "cl100k_base"
|
||||||
|
|
||||||
|
|
||||||
|
class _FlexibleOpenAI(OpenAI):
|
||||||
|
"""OpenAI subclass that tolerates unknown model names for custom endpoints."""
|
||||||
|
|
||||||
|
_custom_context_window: int = _DEFAULT_CONTEXT_WINDOW
|
||||||
|
|
||||||
|
@property
|
||||||
|
def metadata(self) -> LLMMetadata:
|
||||||
|
model_name = self._get_model_name()
|
||||||
|
known_model = model_name in CHAT_MODELS
|
||||||
|
|
||||||
|
try:
|
||||||
|
context_window = openai_modelname_to_contextsize(model_name)
|
||||||
|
except ValueError:
|
||||||
|
context_window = self._custom_context_window
|
||||||
|
|
||||||
|
if known_model:
|
||||||
|
chat = is_chat_model(model=model_name)
|
||||||
|
func_calling = is_function_calling_model(model=model_name)
|
||||||
|
else:
|
||||||
|
chat = True
|
||||||
|
func_calling = True
|
||||||
|
|
||||||
|
return LLMMetadata(
|
||||||
|
context_window=context_window,
|
||||||
|
num_output=self.max_tokens or -1,
|
||||||
|
is_chat_model=chat,
|
||||||
|
is_function_calling_model=func_calling,
|
||||||
|
model_name=self.model,
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _tokenizer(self) -> tiktoken.Encoding | None:
|
||||||
|
try:
|
||||||
|
return tiktoken.encoding_for_model(self._get_model_name())
|
||||||
|
except KeyError:
|
||||||
|
return tiktoken.get_encoding(_FALLBACK_ENCODING)
|
||||||
|
|
||||||
|
|
||||||
def build_system_prompt(base_prompt: str, skills: list[Skill]) -> str:
|
def build_system_prompt(base_prompt: str, skills: list[Skill]) -> str:
|
||||||
if not skills:
|
if not skills:
|
||||||
@@ -28,6 +77,7 @@ def create_agent(
|
|||||||
tools: list[Callable[..., Any]] | None = None,
|
tools: list[Callable[..., Any]] | None = None,
|
||||||
model: str = "gpt-4o-mini",
|
model: str = "gpt-4o-mini",
|
||||||
api_key: str | None = None,
|
api_key: str | None = None,
|
||||||
|
base_url: str | None = None,
|
||||||
base_system_prompt: str = "You are a helpful assistant.",
|
base_system_prompt: str = "You are a helpful assistant.",
|
||||||
) -> AgentWorkflow:
|
) -> AgentWorkflow:
|
||||||
system_prompt = build_system_prompt(base_system_prompt, skills or [])
|
system_prompt = build_system_prompt(base_system_prompt, skills or [])
|
||||||
@@ -35,10 +85,12 @@ def create_agent(
|
|||||||
llm_kwargs: dict[str, Any] = {"model": model}
|
llm_kwargs: dict[str, Any] = {"model": model}
|
||||||
if api_key:
|
if api_key:
|
||||||
llm_kwargs["api_key"] = api_key
|
llm_kwargs["api_key"] = api_key
|
||||||
|
if base_url:
|
||||||
|
llm_kwargs["api_base"] = base_url
|
||||||
|
|
||||||
return AgentWorkflow.from_tools_or_functions(
|
return AgentWorkflow.from_tools_or_functions(
|
||||||
tools_or_functions=tools or [],
|
tools_or_functions=tools or [],
|
||||||
llm=OpenAI(**llm_kwargs),
|
llm=_FlexibleOpenAI(**llm_kwargs),
|
||||||
system_prompt=system_prompt,
|
system_prompt=system_prompt,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ from pathlib import Path
|
|||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Config:
|
class Config:
|
||||||
llm_api_key: str = ""
|
llm_api_key: str = ""
|
||||||
|
llm_base_url: str = ""
|
||||||
llm_model: str = "gpt-4o-mini"
|
llm_model: str = "gpt-4o-mini"
|
||||||
skill_directories: list[Path] = field(default_factory=list)
|
skill_directories: list[Path] = field(default_factory=list)
|
||||||
base_system_prompt: str = "You are a helpful assistant."
|
base_system_prompt: str = "You are a helpful assistant."
|
||||||
@@ -16,17 +17,24 @@ class Config:
|
|||||||
def from_env(cls) -> Config:
|
def from_env(cls) -> Config:
|
||||||
"""Create Config from environment variables.
|
"""Create Config from environment variables.
|
||||||
|
|
||||||
OPENAI_API_KEY, LLM_MODEL, SKILL_DIRECTORIES (comma-separated paths),
|
OPENAI_API_KEY, OPENAI_BASE_URL, LLM_MODEL / LLM_MODEL_NAME,
|
||||||
BASE_SYSTEM_PROMPT.
|
SKILL_DIRECTORIES (comma-separated paths), BASE_SYSTEM_PROMPT.
|
||||||
"""
|
"""
|
||||||
skill_dirs_raw = os.environ.get("SKILL_DIRECTORIES", "")
|
skill_dirs_raw = os.environ.get("SKILL_DIRECTORIES", "")
|
||||||
skill_directories = [
|
skill_directories = [
|
||||||
Path(d.strip()) for d in skill_dirs_raw.split(",") if d.strip()
|
Path(d.strip()) for d in skill_dirs_raw.split(",") if d.strip()
|
||||||
]
|
]
|
||||||
|
|
||||||
|
model = (
|
||||||
|
os.environ.get("LLM_MODEL")
|
||||||
|
or os.environ.get("LLM_MODEL_NAME")
|
||||||
|
or "gpt-4o-mini"
|
||||||
|
)
|
||||||
|
|
||||||
return cls(
|
return cls(
|
||||||
llm_api_key=os.environ.get("OPENAI_API_KEY", ""),
|
llm_api_key=os.environ.get("OPENAI_API_KEY", ""),
|
||||||
llm_model=os.environ.get("LLM_MODEL", "gpt-4o-mini"),
|
llm_base_url=os.environ.get("OPENAI_BASE_URL", ""),
|
||||||
|
llm_model=model,
|
||||||
skill_directories=skill_directories,
|
skill_directories=skill_directories,
|
||||||
base_system_prompt=os.environ.get(
|
base_system_prompt=os.environ.get(
|
||||||
"BASE_SYSTEM_PROMPT", "You are a helpful assistant."
|
"BASE_SYSTEM_PROMPT", "You are a helpful assistant."
|
||||||
|
|||||||
@@ -714,13 +714,17 @@ source = { editable = "." }
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "llama-index-core" },
|
{ name = "llama-index-core" },
|
||||||
{ name = "llama-index-llms-openai" },
|
{ name = "llama-index-llms-openai" },
|
||||||
|
{ name = "llama-index-llms-openai-like" },
|
||||||
|
{ name = "python-dotenv" },
|
||||||
{ name = "python-frontmatter" },
|
{ name = "python-frontmatter" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [
|
requires-dist = [
|
||||||
{ name = "llama-index-core", specifier = ">=0.12.0" },
|
{ name = "llama-index-core", specifier = ">=0.12.0" },
|
||||||
{ name = "llama-index-llms-openai", specifier = ">=0.3.0" },
|
{ name = "llama-index-llms-openai", specifier = ">=0.7.5" },
|
||||||
|
{ name = "llama-index-llms-openai-like", specifier = ">=0.7.1" },
|
||||||
|
{ name = "python-dotenv", specifier = ">=1.0.0" },
|
||||||
{ name = "python-frontmatter", specifier = ">=1.1.0" },
|
{ name = "python-frontmatter", specifier = ">=1.1.0" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -778,15 +782,28 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "llama-index-llms-openai"
|
name = "llama-index-llms-openai"
|
||||||
version = "0.7.4"
|
version = "0.7.5"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "llama-index-core" },
|
{ name = "llama-index-core" },
|
||||||
{ name = "openai" },
|
{ name = "openai" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/40/15/1c79fd19e19c38abcb4d6f16bc4c7ce36651bef1efa31973e01603df235b/llama_index_llms_openai-0.7.4.tar.gz", hash = "sha256:e7e078816babe33b29fa17ea0a771cf9589b2e95f1902cd8f1ec283a3a35c675", size = 27323, upload-time = "2026-03-27T15:32:18.154Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/65/27/18a7fd0873023aed145332dab5a09b95b298e4fff1c21685eaf22b629d87/llama_index_llms_openai-0.7.5.tar.gz", hash = "sha256:54123e679a7cddc1f2e969f278a4654050730daf84691731a0c53ae14feac3c7", size = 27423, upload-time = "2026-03-30T16:30:33.973Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/50/e8/1edce9dad3c7b55e37ca27723f7e8918e71e270bb3e67b49e90abdfaa32f/llama_index_llms_openai-0.7.4-py3-none-any.whl", hash = "sha256:b2cf35ce0d0ecf3209a0406da7383efdbd8f70a1c83eef287e4346c36ea24cba", size = 28378, upload-time = "2026-03-27T15:32:17.205Z" },
|
{ url = "https://files.pythonhosted.org/packages/63/62/a847e9a94c2f92926c30188259f9f86e019dcc45122bbb222dea35a74c02/llama_index_llms_openai-0.7.5-py3-none-any.whl", hash = "sha256:c302c6386873420df3714c3d538f45379b6de27ab6a531f30c67419b39a538f5", size = 28492, upload-time = "2026-03-30T16:30:32.979Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "llama-index-llms-openai-like"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "llama-index-core" },
|
||||||
|
{ name = "llama-index-llms-openai" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/9d/9f/0d98d022a08f43d4374998072636ec50a7cb50009bbb9a2761f5b26a78cc/llama_index_llms_openai_like-0.7.1.tar.gz", hash = "sha256:ce7cef3686b1e62d7c08134b4d8ca56706cca816e4c4098eaede33002829a6f9", size = 5177, upload-time = "2026-03-13T16:15:58.156Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6d/22/a1e1ec1112c69ca0a379cd72691c36cdbcba78362622ce9a27e5a97965cc/llama_index_llms_openai_like-0.7.1-py3-none-any.whl", hash = "sha256:831f1144077c6f9ea7a62e987b7f2af00310dded3056edca2cb509f70a3e650a", size = 4860, upload-time = "2026-03-13T16:15:59.113Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1462,6 +1479,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" },
|
{ url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dotenv"
|
||||||
|
version = "1.2.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "python-frontmatter"
|
name = "python-frontmatter"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user