AgentScope学习笔记代码记录-1

感觉阿里的AgentScope和LangGraph的设计,还是有一类似,可以好好学学。这次先按官方文档进行实操。

一,模型配置

from dotenv import load_dotenv
import asyncio
import os
from agentscope.model import DeepSeekChatModel
from agentscope.credential import DeepSeekCredential
from agentscope.formatter import OpenAIMultiAgentFormatter
from agentscope.message import UserMsg
from agentscope.model import FinishedReason
from pydantic import BaseModel

load_dotenv(verbose=True)
api_key=os.getenv("DEEPSEEK_API_KEY")
model = DeepSeekChatModel(
    credential=DeepSeekCredential(api_key=api_key),
    model='deepseek-v4-flash',
    stream=True,
    formatter=OpenAIMultiAgentFormatter(),
    )
msgs = [UserMsg(name="user", content="Count from 1 to 5.")]

class WeatherInfo(BaseModel):
    city: str
    temperature: float
    units: str

async def main():
    '''
    response = await model(msgs)
    print(response.content)   # [TextBlock(text='1, 2, 3, 4, 5')]

    async  for chunk in await model(msgs):
        if chunk.is_last:
            print('Final:', chunk.content)
        else:
            print('Delta:', chunk.content)
     '''
    response = await model.generate_structured_output(
        messages=[UserMsg(name="user", content="上海今天天气怎么样?")],
        structured_model=WeatherInfo,
    )
    print(response)

async def call_model():
    async for chunk in await model(msgs):
        if chunk.is_last and chunk.finished_reason == FinishedReason.INTERRUPTED:
            # 取消前已累积的部分内容
            print('Interrupted:', chunk.content)


# task = asyncio.create_task(call_model())
# 取消任务即可中断进行中的模型调用
# task.cancel()
asyncio.run(main())


二,上下文

from dotenv import load_dotenv
import asyncio
import os
from agentscope.agent import Agent, InjectionConfig, ContextConfig
from agentscope.model import DeepSeekChatModel
from agentscope.credential import DeepSeekCredential
from agentscope.tool import Toolkit, Bash, Read, Write, Edit
from agentscope.workspace import LocalWorkspace

load_dotenv(verbose=True)
api_key=os.getenv("DEEPSEEK_API_KEY")

workspace=LocalWorkspace(workdir='D:\\testcode\\')
# await workspace.initialize()

model = DeepSeekChatModel(
    credential=DeepSeekCredential(api_key=api_key),
    model='deepseek-v4-flash',
    stream=True,
    )
toolkit = Toolkit(tools=[Bash(), Read(), Write(), Edit()])

agent = Agent(
    name='my_agent',
    system_prompt='你是一个有帮助的助手',
    model=model,
    context_config=ContextConfig(
        trigger_ratio=0.8,
        reserve_ratio=0.1,
        tool_result_limit=3000,
    ),
    toolkit=toolkit,
    injection_config=InjectionConfig(
        timezone='Asia/Shanghai',
        time_interval=1.0,
    ),
    offloader=workspace
)

三, 函数工具

from typing import AsyncGenerator, Any, Callable

from redis.commands.search import result

from agentscope.tool import FunctionTool, Toolkit, ToolMiddlewareBase, ToolBase, ToolChunk
from agentscope.tool import Bash, PowerShell
from agentscope.permission import (
    PermissionContext, PermissionDecision, PermissionBehavior
)
from agentscope.message import TextBlock


bash = Bash(
    additional_dangerous_files=['.secrets'],
    additional_dangerous_directories=[".credentials"],
)
pwsh = PowerShell(cmd='C:\\users\me\\project')

class WebSearch(ToolBase):
    name = 'WebSearch'
    description = 'Search the web for information on a given query.'
    input_schema = {
        'type': 'object',
        'properties': {
            'query': {
                'type': 'string',
                'description': 'The Search query.',
            },
        },
        'required': ['query'],
    }
    is_concurrency_safe = True
    is_read_only = True

    async def check_permissions(
        self,
        tool_input: dict[str, Any],
        context: PermissionContext,
    ) -> PermissionDecision:
        return PermissionDecision(
            behavior=PermissionBehavior.ALLOW,
            message='Web search is read-only.',
        )
    async  def call(self, query: str) -> ToolChunk:
        # results = await do_search(query) # 需要实现的异步操作
        results = 'demo'
        return ToolChunk(content=[TextBlock(text=results)])


def get_weather(city:str, unit:str = 'celsius') -> str:
    """
    Get weather data for given city and unit.
    Args:
        city (str): City name.
        unit (str, optional): Unit name. Defaults to 'celsius'.
    """
    return f'The weather for {city} is {unit} celsius.'
toolkit = Toolkit(tools=[FunctionTool(get_weather)])



class LoggingMiddleware(ToolMiddlewareBase):
    async def on_tool_call(self,
                         tool: ToolBase,
                         input_kwargs: dict[str, Any],
                         next_handler: Callable[..., AsyncGenerator[ToolChunk, None]],
                         ) -> AsyncGenerator[ToolChunk, None]:
        print(f'-> 调用{tool.name},参数:{input_kwargs}')
        async for chunk in next_handler(**input_kwargs):
            yield chunk
        print(f'OK,{tool.name}执行完毕')

class RetryMiddleware(ToolMiddlewareBase):
    def __init__(self, max_attempts: int = 3):
        self.max_attempts = max_attempts

    async def on_tool_call(self,
                         tool: ToolBase,
                         input_kwargs: dict[str, Any],
                         next_handler: Callable[..., AsyncGenerator[ToolChunk, None]],
                         ) -> AsyncGenerator[ToolChunk, None]:
        for attempt in range(1, self.max_attempts + 1):
            try:
                async for chunk in next_handler(**input_kwargs):
                    yield chunk
                return
            except Exception as e:
                if attempt == self.max_attempts:
                    print(f'第{attempt}次失败:{e},重试中...')
        print(f'-> 调用{tool.name},参数:{input_kwargs}')

bash = Bash(middlewares=[LoggingMiddleware(), RetryMiddleware(max_attempts=3)])

from cryptography.x509 import name

from agentscope.tool import Toolkit, ToolGroup, Bash, Read, Write, Edit

db_query_tool = [Bash(),  Write(), Edit()],
db_migrate_tool = [Read(), Write(), Edit()],
deploy_tool = [Bash(), Read(),  Edit()],
rollback_tool = [Bash(), Read(), Write()],

toolkit = Toolkit(
    tool_groups=[
        ToolGroup(
            name='database',
            description='Tools for database operations',
            instructions='Always wrap mutations in a transaction',
            tools=[db_query_tool, db_migrate_tool],
        ),
    ToolGroup(
            name='deployment',
            description='Tools fordeploying services.',
            instructions='Confirm the target environment before deploying ',
            tools=[deploy_tool, rollback_tool],
        ),
    ]
)

四 ,MCP

from agentscope.mcp import MCPClient, HttpMCPConfig
from agentscope.tool import Toolkit

client = MCPClient(
    name="search",
    is_stateful=False,
    mcp_config=HttpMCPConfig(url='https://api.search.com/mcp'),
    enable_tools=['web_search', 'image_search'],
)

toolkit = Toolkit(mcps=[client])

五,SKILL

from agentscope.tool import Toolkit
from agentscope.skill import LocalSkillLoader

skill_loader = LocalSkillLoader(
    directory='/path/to/skills',
    scan_subdir=True,
)

toolkit = Toolkit(skills_or_loaders=[skill_loader])

六 Plan

from agentscope.agent import Agent
from agentscope.state import  Task
from agentscope.tool import Toolkit, TaskGet, TaskCreate, TaskList, TaskUpdate

agent = Agent(
    name='planner',
    system_prompt='You are a planning assistant.',
    toolkit=Toolkit(
        tools=[TaskCreate(), TaskGet(), TaskList(), TaskUpdate()],
    )
)

agent.state.tasks_context.tasks.extend(
    [
        Task(
            id='1',
            subject='Fetch project requirements',
            description='Read README.md and CONTRIBUTIING.md in the repo root.',
            metadata={'source': 'seed'}
        ),
        Task(
            id='2',
            subject='Draft an inplementation plan',
            description='Produce a step-by-step plan based on the requirements.',
            metadata={'source': 'seed'}
        ),
    ]
)

agent.state.tasks_context.tasks[1].blocks.append('2')
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容