tina
一个轻量、模块化的 AI 智能体框架,基于 OpenAI API 格式构建。
安装
# 基础安装(需要 Python >= 3.10)
pip install tina-python
# 如果需要使用 MCP(模型上下文协议)服务
pip install tina-python[mcp]
# 如果需要 TUI 终端界面
pip install tina-python[tui]
# 一次装齐所有可选功能(TUI + MCP)
pip install tina-python[all]
# 如果需要运行测试
pip install tina-python[test]
快速开始
from tina import Agent, Tools
from tina.llm import BaseAPI
# 1. 实例化大模型(支持通过 tina.env 文件配置)
llm = BaseAPI(
api_key="your-api-key",
base_url="https://api.openai.com/v1/chat/completions",
model="gpt-4o"
)
# 2. 创建工具集并注册工具
tools = Tools()
@tools.register()
def get_weather(city: str):
"""
查询城市天气
Args:
city (str): 城市名称
"""
return f"{city}今天天气晴朗,温度25°C"
# 3. 创建 Agent 并运行
agent = Agent(
llm=llm,
tools=tools,
system_prompt="你是一个有用的助手"
)
# 流式对话
result = agent.predict(instruction="今天的北京天气怎么样?", stream=True)
for chunk in result:
print(chunk.content, end="", flush=True)
目录
- tina 是什么
- 特性概览
- 一、LLM 层 —— 调用大模型
- 二、Tools 层 —— 工具注册与管理
- 三、Agent 层 —— 智能体
- 四、MCP 支持 —— 模型上下文协议
- 五、多模态支持
- 六、快速开发工具
- 6.5 终端界面 TUI(可选扩展)
tina 是什么
tina 是一个轻量、模块化的 AI 智能体框架,专注于让开发者以最少的代码实现大模型应用的原型验证。
设计理念:
- 简单直观:不需要复杂的 Chain 或 Graph 概念,像调用函数一样使用大模型
- 模块化:LLM、Tools、Agent 各层独立,可按需使用
- 轻量依赖:核心仅依赖
httpx和python-dotenv - 注释即描述:通过 Google 风格的注释自动生成工具 JSON Schema
tina 是我大学期间兴趣使然开发的练习作品,适合快速原型验证。如果需要生产级的稳定性,请使用 LangChain 等成熟框架。
特性概览
| 模块 | 功能 | 说明 |
|---|---|---|
| BaseAPI | API 调用 | 支持流式/非流式、工具调用、多种采样参数 |
| BaseMultimodalAPI | 多模态调用 | 支持图片、音频、URL 输入 |
| Tools | 工具管理 | 注册、合并、执行,自动生成 Schema |
| Agent | 智能体 | 自动维护对话、执行工具、事件回调 |
| MultimodalAgent | 多模态智能体 | 继承 Agent,支持多媒体输入与多模态工具 |
| MCPClient | MCP 集成 | 连接 MCP 服务器生态(stdio/SSE) |
| ContextManager | 上下文管理 | 滚动窗口策略,自动截断 |
| AgentEvents | 事件系统 | 贯穿 Agent 生命周期的回调钩子 |
| TUI(可选) | 终端界面 | 测试你写的 Agent 的交互控制台,也可当作自己的 TUI 使用 |
一、LLM 层 —— 调用大模型
tina 使用 httpx 直接调用 OpenAI 格式的 API,不依赖 OpenAI SDK。
1.1 快速使用
from tina.llm import BaseAPI
# 推荐:使用 tina.env 文件(自动从当前目录查找 .env 或 tina.env)
llm = BaseAPI()
# 或者:手动传入参数
llm = BaseAPI(
api_key="your-api-key",
base_url="https://api.openai.com/v1/chat/completions",
model="gpt-4o"
)
tina.env 文件示例:
LLM_API_KEY="your-api-key"
BASE_URL="https://api.openai.com/v1/chat/completions"
MODEL_NAME="gpt-4o"
注意:
base_url需要包含完整的/chat/completions路由,tina 不会自动补充。
1.2 非流式调用
result = llm.predict(
input_text="帮我翻译这句话:Hello tina",
sys_prompt="你是一位专业的翻译家",
stream=False
)
print(result["content"])
1.3 流式调用
result = llm.predict(
input_text="讲一个故事",
stream=True
)
for chunk in result:
print(chunk["content"], end="")
1.4 多轮对话
messages = [
{"role": "system", "content": "你是一个有用的助手"},
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!有什么可以帮助你的吗?"}
]
result = llm.predict(
input_text="北京天气怎么样?", # 自动追加到 messages
messages=messages,
stream=True
)
1.5 异步调用
result = await llm.apredict(
input_text="你好",
stream=False
)
# 异步流式:先 await 拿到异步生成器
result = await llm.apredict(input_text="讲个故事", stream=True)
async for chunk in result:
print(chunk["content"], end="")
1.6 predict 参数说明
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
input_text |
str |
None |
用户输入文本 |
sys_prompt |
str |
"你的工作非常的出色!" |
系统提示词 |
messages |
list |
None |
历史消息列表 |
temperature |
float |
1.0 |
随机性 (0.0~1.0) |
top_p |
float |
0.9 |
核采样 |
top_k |
int |
None |
Top-K 采样 |
min_p |
float |
None |
最小概率采样 |
max_tokens |
int |
None |
最大生成 token 数 |
presence_penalty |
float |
None |
存在惩罚 (-2.0~2.0) |
frequency_penalty |
float |
None |
频率惩罚 (-2.0~2.0) |
stream |
bool |
False |
是否流式输出 |
format |
str |
"text" |
输出格式:"text" 或 "json" |
tools |
list |
None |
工具列表 |
timeout |
int |
180 |
超时时间(秒) |
1.7 返回值格式
# 非流式
{
"role": "assistant",
"content": "回复内容",
# 有工具调用时会出现
"tool_calls": [
{
"index": 0,
"function": {"name": "...", "arguments": "{}"},
"type": "function",
"id": "call_xxx"
}
]
}
# 流式:逐块返回片段,工具调用以 tool_name / tool_arguments 片段给出;
# 推理模型的思维链在 reasoning_content 中,末尾可能带有 usage
1.8 获取可用模型列表
# 仅适用于标准 OpenAI API
models = llm.get_models()
print(models["available_models"])
二、Tools 层 —— 工具注册与管理
Tools 是 tina 的工具管理核心,支持注册、查询、合并和执行。
2.1 创建工具集
from tina import Tools
# 简单使用(不指定名称)
tools = Tools()
# 命名工具集(用于包管理和合并)
tools = Tools(name="my_tools", metadata={"author": "me"})
指定
name后会给工具添加命名空间前缀({name}_{函数名}),方便工具包合并时避免名称冲突。
2.2 注册工具
装饰器方式(推荐)
tools = Tools()
@tools.register()
def get_weather(city: str):
"""
查询城市天气
Args:
city (str): 城市名称
"""
return f"{city}今天天气晴朗"
@tools.register(
description="手动描述(可选)",
require_confirmation=True, # 需要用户确认
return_image=False, # 多模态:返回图片
return_audio=False, # 多模态:返回音频
return_url=False, # 多模态:返回 URL
)
def delete_file(path: str):
"""删除文件(高危操作)"""
...
方法方式
def add(a: int, b: int):
"""两数相加"""
return a + b
tools.register_tool(tool=add)
注册不带功能实现的工具
tools.register_no_function(
name="search",
description="搜索引擎",
required_parameters=["query"],
parameters={
"query": {
"type": "string",
"description": "搜索关键词"
}
}
)
2.3 注销工具
tools.unregister("get_weather")
2.4 工具包合并(命名空间隔离)
适用于分发和组合工具包:
from tina import Tools
search_tools = Tools(name="search")
@search_tools.register()
def web(query: str):
"""网页搜索"""
return f"搜索结果:{query}"
data_tools = Tools(name="data")
@data_tools.register()
def query(sql: str):
"""数据库查询"""
return f"查询结果:{sql}"
# 合并工具包
all_tools = search_tools + data_tools
# 或
all_tools += data_tools
# 添加多个
all_tools.add_tools([search_tools, data_tools])
# 减掉工具包
all_tools -= search_tools
# 或
all_tools.sub_tools([search_tools])
2.5 执行工具
tool_calls = [
{
"id": "call_123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": '{"city": "北京"}'
}
}
]
# execute 需要事件对象(Agent 内部会自动传入)
from tina import AgentEvents
results = tools.execute(tool_calls, events=AgentEvents())
# [
# {"role": "tool", "tool_call_id": "call_123", "tool_name": "get_weather", "content": "北京今天天气晴朗"}
# ]
2.6 工具查询
# 获取所有工具 Schema
tools.get_tools()
# 获取单个工具信息
tools.get_tool_info("get_weather")
# 获取工具函数
func = tools.get_tool("get_weather")
result = func("上海")
2.7 在类中定义工具(最佳实践)
class SearchService:
def __init__(self, api_key: str):
self.api_key = api_key
self.tools = Tools(name="search_service")
self.tools.register_tool(self.web_search)
def web_search(self, query: str):
"""
互联网搜索
Args:
query (str): 搜索关键词
"""
return f"搜索结果:{query}"
def get_tools(self):
return self.tools
# 使用
search = SearchService(api_key="xxx")
agent = Agent(llm=llm, tools=search.get_tools())
2.8 Google 风格注释解析
tina 会自动解析以下格式的注释生成 JSON Schema:
def tool_func(param1: str, param2: int):
"""
工具的描述(会被提取为 description)
Args:
param1 (str): 参数1的描述
param2 (int): 参数2的描述
Returns:
str: 返回值描述
Raises:
ValueError: 异常描述
"""
三、Agent 层 —— 智能体
Agent = LLM + Tools + ContextManager,自动维护对话上下文并执行工具调用循环。
3.1 实例化 Agent
from tina import Agent, Tools
from tina.llm import BaseAPI
llm = BaseAPI()
tools = Tools()
agent = Agent(
llm=llm,
tools=tools,
system_prompt="你是一个有用的助手",
name="my_agent", # 可选:Agent 名称
mcp=None, # 可选:MCPClient 实例
events=None, # 可选:AgentEvents 实例
context_manager=None, # 可选:自定义 ContextManager
agent_runtime=None, # 可选:自定义 AgentRuntime
max_tool_loop=30, # 最大工具调用循环次数
max_context_length=100000,# 最大上下文长度(字符)
max_tool_result_length=6000, # 工具结果最大长度
)
3.2 使用 Agent 对话
# 流式输出(默认)
result = agent.predict(instruction="今天北京天气怎么样?", stream=True)
for chunk in result:
print(chunk.content, end="", flush=True)
# 非流式输出
result = agent.predict(instruction="你好", stream=False)
print(result.content)
# 异步流式
async for chunk in agent.apredict(instruction="你好"):
print(chunk.content, end="")
# 异步非流式
result = await agent.apredict_no_stream(instruction="你好")
predict 参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
instruction |
str |
None |
用户指令 |
temperature |
float |
0.5 |
采样温度 |
top_p |
float |
0.9 |
核采样 |
top_k |
int |
1 |
Top-K 采样 |
min_p |
float |
0.0 |
最小概率采样 |
stream |
bool |
True |
是否流式输出 |
3.3 Agent 状态
from tina import AgentState
# 获取当前状态
if agent.state == AgentState.IDLE:
print("Agent 空闲中")
elif agent.state == AgentState.RESPONDING:
print("Agent 正在输出")
elif agent.state == AgentState.THINKING:
print("Agent 正在思考")
elif agent.state == AgentState.TOOL_CALLING:
print("Agent 正在使用工具")
elif agent.state == AgentState.ON_TOOL_CONFIRM:
print("Agent 等待工具确认")
elif agent.state == AgentState.ERROR:
print("Agent 出错")
3.4 消息管理
# 获取消息列表
messages = agent.get_messages()
# 清空全部消息(含系统提示词,之后需重新 set_system_prompt)
agent.clear_messages()
# 获取系统提示词
prompt = agent.get_system_prompt()
# 设置系统提示词
agent.set_system_prompt("新的系统提示词")
# 添加单条消息
agent.add_message(role="user", content="你好")
# 添加消息列表
agent.add_messages([
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!"}
])
# 获取工具调用信息
last_call = agent.get_last_tool_call()
last_result = agent.get_last_tool_result()
tool_calls = agent.get_tools_call()
tool_results = agent.get_tools_call_result()
3.5 事件回调(Event Hooks)
Agent 提供了丰富的生命周期事件:
# 1. 用户指令处理前(可修改输入)
@agent.before_user_instruction()
def on_before_user(user_message: str):
return f"【增强】{user_message}" # 返回修改后的输入
# 2. 用户指令处理后
@agent.after_user_instruction()
def on_after_user(user_message: str, assistant_message: str):
print(f"问:{user_message}")
print(f"答:{assistant_message}")
# 3. 工具调用前(可修改参数)
@agent.before_tool_call()
def on_before_tool(tool_name: str, tool_arguments: dict):
return tool_name, tool_arguments # 必须返回两个参数
# 4. 工具调用后(可修改结果)
@agent.after_tool_call()
def on_after_tool(tool_name: str, tool_arguments: dict, tool_result: any):
return tool_name, tool_arguments, tool_result # 必须返回三个参数
# 5. 工具需要确认时
@agent.on_tool_confirmation()
def on_confirm(tool_name: str, tool_arguments: dict):
return True # 放行
# return False # 拦截
# return (False, "自定义拒绝理由") # 拦截并说明理由
# 6. 流式片段监听
@agent.on_stream_chunk()
def on_stream(chunk):
print(chunk.content, end="", flush=True)
# 7. 工具序列监听
@agent.before_tool_calls()
def on_before_calls(tool_calls: list):
print(f"模型准备调用 {len(tool_calls)} 个工具")
@agent.after_tool_calls()
def on_after_calls(tool_calls: list):
print(f"工具调用完成")
# 8. 推理轮次结束
@agent.on_turn_end()
def on_turn_end():
print("本轮推理完成")
注意:
- 事件处理函数可以是同步或异步的。异步函数仅在
apredict时执行- 拦截型事件(before_xxx)如果有返回值,必须原样返回对应数量的参数
3.6 多 Agent 连接
agent_a = Agent(llm=llm, tools=tools, name="agent_a")
agent_b = Agent(llm=llm, tools=tools, name="agent_b")
# 关联另一个 Agent(记录到 other_agents,目前不会自动共享消息列表)
agent_a.connect_agent(agent_b)
# 断开连接
agent_a.disconnect_agent(agent_b)
3.7 自定义事件管理
from tina import AgentEvents
events = AgentEvents()
@events.on_stream_chunk()
def on_stream(chunk):
print(chunk.content, end="")
@events.on_turn_end()
def on_end():
print("完成")
agent = Agent(
llm=llm,
tools=tools,
events=events
)
3.8 输出格式(流式)
Agent 流式输出的每一帧是一个 AgentResponse 对象,包含以下可能的字段:
# 1. 普通文本输出
AgentResponse(role="assistant", content="回复内容")
# 2. 推理模型输出
AgentResponse(role="assistant", content="", reasoning_content="推理链")
# 3. 工具调用通知
AgentResponse(role="assistant", content="", tool_name="get_weather")
# 4. 工具参数片段
AgentResponse(role="assistant", content="", tool_name="get_weather", tool_arguments='{"city": "北京"}')
# 5. 完整工具调用
AgentResponse(role="assistant", content="", tool_calls=[...])
# 6. 工具执行结果
AgentResponse(role="tool", content="工具返回结果", tool_name="get_weather")
四、MCP 支持 —— 模型上下文协议
tina 支持通过 MCP(Model Context Protocol)连接外部工具生态。
4.1 安装 MCP 依赖
pip install tina-python[mcp]
想一次装齐所有可选功能(TUI + MCP):
pip install tina-python[all]
4.2 使用 MCP 客户端
from tina.mcp import MCPClient
mcp = MCPClient()
# 添加 stdio 类型 MCP 服务
mcp.add_server(
server_id="playwright",
type="stdio",
command="npx",
args=["@playwright/mcp@latest"],
)
# 添加 Streamable HTTP 类型 MCP 服务(推荐,取代旧 SSE)
mcp.add_server(
server_id="my-service",
type="http", # 也支持 streamable_http / streamableHttp
url="http://localhost:8080/mcp",
headers={"Authorization": "Bearer YOUR_API_KEY"}, # 可选
)
# 添加 SSE 类型 MCP 服务(旧传输,仍兼容)
mcp.add_server(
server_id="my-legacy-service",
type="sse",
url="http://localhost:8080/sse",
headers={"Authorization": "Bearer YOUR_API_KEY"}, # 可选
)
type为必填项,用于区分传输类型;command/args/env与url/headers分别对应 stdio 与远程类型,编辑器会根据type给出对应的参数提示。
4.3 在 Agent 中使用 MCP
from tina import Agent, Tools
from tina.llm import BaseAPI
from tina.mcp import MCPClient
mcp = MCPClient()
mcp.add_server(
server_id="playwright",
type="stdio",
command="npx",
args=["@playwright/mcp@latest"],
)
llm = BaseAPI()
tools = Tools()
agent = Agent(
llm=llm,
tools=tools,
mcp=mcp,
system_prompt="你是一个浏览器自动化助手"
)
result = agent.predict(instruction="导航到 bing.com 并搜索 tina", stream=True)
for chunk in result:
print(chunk.content, end="")
4.4 MCP 服务管理
# 添加服务(参数与 MCPClient.add_server 一致)
agent.add_mcp_server("server_id", type="http", url="http://localhost:8080/mcp")
# 移除服务
agent.remove_mcp_server("server_id")
# 获取服务信息
info = agent.get_mcp_server_info("server_id")
# 获取所有服务信息
all_info = agent.get_mcp_server_info()
4.5 MCP 工具转换
MCPClient 会自动将 MCP 工具转换为 Tina 工具格式,Agent 可直接调用。
五、多模态支持
5.1 多模态 LLM
from tina.llm import BaseMultimodalAPI
mllm = BaseMultimodalAPI()
# 图片输入
result = mllm.predict(
input_text="这张图里有什么?",
input_image="path/to/image.jpg",
stream=False
)
# 多图片 + 音频
result = mllm.predict(
input_text="描述这些内容",
input_image=["image1.jpg", "image2.png"],
input_audio="audio.mp3",
)
5.2 多模态 Agent
from tina import MultimodalAgent, Tools
from tina.llm import BaseMultimodalAPI
mllm = BaseMultimodalAPI()
tools = Tools()
magent = MultimodalAgent(
llm=mllm,
tools=tools
)
result = magent.predict(
instruction="这张图显示了什么天气?",
image="weather.jpg",
)
5.3 多模态工具
注册工具时指定返回类型,tina 会自动处理多媒体数据转换:
@tools.register(return_image=True)
def capture_screenshot(url: str):
"""
截取网页截图
Args:
url (str): 网页地址
"""
return "screenshot.png" # 自动转为 Base64 给模型
@tools.register(return_audio=True)
def text_to_speech(text: str):
"""
文本转语音
Args:
text (str): 要朗读的文本
"""
return "speech.mp3"
@tools.register(return_url=True)
def search_product(query: str):
"""
搜索商品
Args:
query (str): 搜索词
"""
return "https://example.com/product/123"
magent = MultimodalAgent(llm=mllm, tools=tools)
5.4 构建多模态消息
from tina.utils import build_multimodal_message
message = build_multimodal_message(
input_text="描述这张图",
input_image="image.jpg",
input_audio="audio.mp3",
input_url="https://example.com/image.png",
image_detail="high", # 细节:low / high / auto
)
六、快速开发工具
tina 提供了一些开箱即用的工具函数和工具包,帮助你快速搭建应用。
6.1 系统工具包 system_tools
tina 自带一套系统工具包,包含文件操作、代码执行等常用功能:
from tina import Agent, Tools
from tina.llm import BaseAPI
from tina.utils.system_tools import system_tools
tools = Tools(name="my_tools")
tools += system_tools # 添加 tina 自带的系统工具包(工具集需命名)
agent = Agent(
llm=BaseAPI(),
tools=tools,
system_prompt="你是一个系统助手,可以帮助我管理文件和执行代码"
)
result = agent.predict(instruction="帮我看看当前目录下有哪些文件", stream=True)
for chunk in result:
print(chunk.content, end="")
内置工具一览:
| 工具名称 | 需要确认 | 功能说明 |
|---|---|---|
get_time |
❌ | 获取当前系统时间 |
list_dir |
❌ | 列出目录下的文件和子目录 |
project_tree |
❌ | 获取项目目录结构(类似 tree 命令) |
get_path |
❌ | 获取文件/文件夹的绝对路径 |
read_code |
❌ | 按字符范围读取文件内容片段 |
read_code_by_line |
❌ | 按行读取代码片段(带行号) |
search_in_files |
❌ | 在项目中按正则搜索文本(自动忽略 .git/.venv 等) |
delay |
❌ | 延时函数 |
make_dir |
✅ | 创建目录(自动创建父目录) |
write_code |
✅ | 写入文件内容(覆盖,自动创建父目录) |
append_code |
✅ | 追加写入文件内容(自动创建父目录) |
delete_path |
✅ | 删除文件或目录(recursive=True 可递归) |
replace_code_by_lines |
✅ | 按行范围替换代码块 |
terminal |
✅ | 在终端运行指令(带超时) |
run_python |
✅ | 执行一小段 Python 代码 |
shot_down_system |
✅ | 关机 |
需要确认的工具在执行时会触发on_tool_confirmation事件,适合接入人工审批流程。由于系统工具包使用了命名空间,工具在模型侧的实际名称为
tina_sys_tools_{名称},例如tina_sys_tools_read_code。
6.2 后台工作器 AgentWorker
AgentWorker 将 Agent 包装为异步后台服务,通过消息队列接收外部指令并持续处理:
from tina import Agent, Tools
from tina.llm import BaseAPI
from tina.utils import AgentWorker
llm = BaseAPI()
tools = Tools()
agent = Agent(llm=llm, tools=tools)
worker = AgentWorker(agent=agent, max_queue_size=20)
# 添加流式输出处理器
def on_chunk(chunk):
print(chunk.content, end="", flush=True)
worker.add_stream_chunk_handler(on_chunk)
# 在其他协程中向工作器推送指令
import asyncio
async def main():
# 启动工作器
asyncio.create_task(worker.run())
# 推送指令
await worker.put("你好,请帮我查一下天气")
await worker.put("现在几点了?")
# 查看队列状态
print(f"队列中待处理消息数: {worker.get_queue_size()}")
asyncio.run(main())
AgentWorker 还会将自身的 put 方法自动注册为 Agent 的工具,方便多 Agent 场景下互相调用。
6.3 终端交互控制台 run_agent_in_cli
快速启动一个 Agent 交互式终端,适合调试和测试:
from tina import Agent, Tools
from tina.llm import BaseAPI
from tina.utils.run_agent_in_cli import run_agent_in_cli
# 搭建你的 Agent
llm = BaseAPI()
tools = Tools()
agent = Agent(llm=llm, tools=tools)
# 一键启动交互终端
run_agent_in_cli(agent)
启动后可在终端直接与 Agent 对话,支持以下指令:
| 指令 | 功能 |
|---|---|
#context |
查看当前对话上下文(消息列表) |
#clear |
清屏 |
exit / quit |
退出对话(#exit 不支持,会被当作普通输入) |
6.4 多模态消息构建器 build_multimodal_message
用于灵活构建包含多模态内容的消息:
from tina.utils import build_multimodal_message
message = build_multimodal_message(
input_text="描述这张图片",
input_image="path/to/image.jpg",
input_audio="path/to/audio.mp3",
input_url=["https://example.com/image1.png", "https://example.com/image2.png"],
image_detail="high", # low / high / auto
role="user"
)
print(message)
# {"role": "user", "content": [{"type": "text", "text": "..."}, {"type": "image_url", ...}]}
6.5 终端界面 TUI(可选扩展)
tina 自带一个基于 Textual 的终端界面。它的定位是可选扩展:方便你测试自己写的 Agent,也可以直接当作自己的 TUI 来用。核心不依赖它,需要额外安装:
pip install tina-python[tui]
from tina import Agent, Tools
from tina.llm import BaseAPI
from tina.utils.tui import run_agent_in_tui
agent = Agent(llm=BaseAPI(), tools=Tools())
run_agent_in_tui(agent, max_tokens=32000)
# 想不受上下文长度限制(不裁剪历史、不截断工具结果):
# run_agent_in_tui(agent, unlimited_context=True)
特性:
- 助手正文流式渲染(Markdown),推理内容与工具调用卡片均可折叠
- 消费与渲染解耦(定时渲染泵):极快或极长的输出都不掉帧
- 自动为 Agent 注册工具确认事件(
require_confirmation=True的工具会弹出选择条) - 上下文 token 占用与上限进度(显示百分比,≥80% 变黄、超限变红警告),运行时显示动画
Esc可打断本轮回复;已生成的部分正文写回上下文,进行中的工具调用记为「该次调用被打断」- 输入框支持多行与粘贴;
Enter发送、Shift+Enter换行、Tab补全命令 - 底部粘性滚动:在底部时自动跟随输出,向上滚动查看历史时不会被打扰,滚回底部自动恢复
- 可选
unlimited_context=True:用 tina 提供的无限制上下文管理器替换 Agent 的(不裁剪历史、不截断工具结果)
| 指令 | 功能 |
|---|---|
#help |
查看可用命令 |
#tools |
查看当前工具、描述与参数 |
#context |
查看当前上下文 |
#model |
查看当前模型信息 |
#tokens |
查看当前上下文 token 占用 |
#compact |
压缩上下文(让 Agent 自我总结并并入 system) |
#clear |
清空上下文与界面 |
#exit |
退出 |
快捷键:Ctrl+↑/↓ 跳转消息、Ctrl+Home/End 首/末条、Ctrl+R 折叠思考、Ctrl+T 折叠工具与结果、Ctrl+O 查看完整工具参数、Esc 关闭弹窗/取消确认 / 打断本轮回复。
界面是可选的:数据层
TuiMessageStore(渲染块列表)和TokenCounter(token 计数)不依赖 textual,可以单独导入,用来接入你自己的界面。
完整说明(安装、指令、快捷键、自建界面)见 docs/tui.md。
附录
环境配置
tina 支持通过环境文件配置 API 信息,自动从当前目录查找 .env 或 tina.env:
LLM_API_KEY="your-api-key"
BASE_URL="https://api.openai.com/v1/chat/completions"
MODEL_NAME="gpt-4o"
MAX_INPUT=8000
依赖说明
| 用途 | 依赖 |
|---|---|
| 核心功能 | httpx, python-dotenv |
| MCP 支持 | mcp |
| TUI 界面(可选) | textual |
| 测试 | pytest, pytest-asyncio, pytest-cov |
许可证
Apache License 2.0
贡献
欢迎提交 Issue 和 PR!项目地址:https://github.com/XIMOCY/tina
Release files for tina-python 0.6.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tina_python-0.6.7.tar.gz | 105.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tina_python-0.6.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 213.9 kB
Release files / tina_python-0.6.7.tar.gz
| Download URL | tina_python-0.6.7.tar.gz |
|---|---|
| Size | 105.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b9bfc7a5a563e0f38a94b2be9e2647ebc1d9de6b404faf1f3eef726d8f23019
|
|
BLAKE2b-256 checksum How to use checksums |
e6569ec4aa6025e0cea4411438222d656ffb65b0a7caf913a2cec32b4c900bbf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / tina_python-0.6.7-py3-none-any.whl
| Download URL | tina_python-0.6.7-py3-none-any.whl |
|---|---|
| Size | 108.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
06f32a0d5f763feb7cb494cb48ce2487c96bb756023ea61f533c0a82b1b921f7
|
|
BLAKE2b-256 checksum How to use checksums |
1a82ecf2a979b2dca4b9b3a693c92b8694e5d30c239980ac51692fa6b8d956c1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|