Skip to content
0

Agent

构建一个最简单的 Agent

LLM 直接调用 tool

使用 LLM 简单的调用一个 function tool,如果尝试运行下面这个代码,大概率 llm 会返回规整的 {'name': 'Happy Birthday', 'artist': 'Taylor Swift'} 结构化数据

from llama_index.llms.ollama import Ollama
from llama_index.core.tools import FunctionTool

llm = Ollama(model="qwen3:32b", base_url="http://ollama-ai:40792")

def generate_song(name: str, artist: str) -> dict:
    """
    Generates a song with provided name and artist.
    """
    return {"name": name, "artist": artist}

tool = FunctionTool.from_defaults(fn=generate_song)

response = llm.predict_and_call(
    [tool],
    "Please generate a song, the name is Happy Birthday and the artist is Taylor Swift.",
)
print(str(response))

LLM + tool 构建 FunctionAgent

我这里使用的本地的 Ollama 模型,构建一个 Agent,它是一个 FunctionAgent,其中参入了 multiply 这个 tool

from llama_index.llms.ollama import Ollama
from llama_index.core.agent.workflow import FunctionAgent
import asyncio

llm = Ollama(model="qwen3:32b", base_url="http://ollama-ai:40792")

def multiply(a: float, b: float) -> float:
    """Multiply two numbers."""
    return a * b

agent = FunctionAgent(
    tools=[multiply],
    llm=llm,
    system_prompt="You are a helpful asistant that can mutiply to numbers",
)

async def main():
    response = await agent.run("what's the result of 500 * 5")
    print(response)

if __name__ == "__main__":
    asyncio.run(main())

LLM + tool 构建 AgentWorkFlow

from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.core.tools import FunctionTool
from llama_index.llms.ollama import Ollama

llm = Ollama(model="qwen3:32b", base_url="http://ollama-ai:40792")


def multiply(a: float, b: float) -> float:
    """Multiply two numbers and returns the product"""
    return a * b


def add(a: float, b: float) -> float:
    """Add two numbers and returns the sum"""
    return a + b


multiplyTool = FunctionTool.from_defaults(multiply)

workflow = AgentWorkflow.from_tools_or_functions(
    [multiplyTool, add],
    llm=llm,
    system_prompt="You are an agent that can perform basic mathematical operations using tools.",
)


async def main():
    response = await workflow.run(user_msg="What is 20+(2*4)?")
    print(response)


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

回复内容如下:

<think>
Okay, let's see. The user asked for 20 + (2 * 4). I first need to handle the multiplication part because of the parentheses. So I called the multiply function with 2 and 4, which gave me 8. Then I added that result to 20 using the add function, which gave 28. The user probably wants the final answer, so I should present that clearly. Let me check if there are any other steps or if I made a mistake. No, the order of operations is correct. Multiply first, then add. The answer should be 28.
</think>

The result of $ 20 + (2 \times 4) $ is **28**

LLM 状态保存和还原

from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.tools.yahoo_finance import YahooFinanceToolSpec
from llama_index.core.workflow import Context
from llama_index.core.workflow import JsonPickleSerializer, JsonSerializer
from llama_index.llms.ollama import Ollama

llm = Ollama(model="qwen3:32b", base_url="http://ollama-ai:40792")


def multiply(a: float, b: float) -> float:
    """Multiply two numbers and returns the product"""
    return a * b


def add(a: float, b: float) -> float:
    """Add two numbers and returns the sum"""
    return a + b


finance_tools = YahooFinanceToolSpec().to_tool_list()
finance_tools.extend([multiply, add])

workflow = AgentWorkflow.from_tools_or_functions(
    finance_tools,
    llm=llm,
    system_prompt="You are an agent that can perform basic mathematical operations using tools.",
)

ctx = Context(workflow)


async def main():
    response1 = await workflow.run("The price of Apple stock is $400?", ctx=ctx)

    print(response1)

    response2 = await workflow.run("What is the price of Apple stock?", ctx=ctx)

    print(response2)

    ctx_dict = ctx.to_dict(JsonPickleSerializer())

    restored_dict = Context.from_dict(
        workflow=workflow, ctx_dict=ctx_dict, serializer=JsonPickleSerializer()
    )

    response3 = await workflow.run(
        "What is the price of Apple stock?", ctx=restored_dict
    )

    print(response3)


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

LLM 可读写状态

from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.core.workflow import Context
from llama_index.llms.ollama import Ollama


async def set_name(ctx: Context, name: str):
    state = await ctx.store.get("state")
    state["name"] = name
    await ctx.store.set("state", state)
    return f"Name set to {name}"


llm = Ollama(model="qwen3:32b", base_url="http://ollama-ai:40792")

workflow = AgentWorkflow.from_tools_or_functions(
    [set_name],
    llm=llm,
    system_prompt="You are a helpful assistant that can set a name",
    initial_state={"name": "unset"},
)


async def main():
    ctx = Context(workflow)
    response = await workflow.run("What is my name?", ctx=ctx)
    print(str(response))

    response2 = await workflow.run("My name is shuheng", ctx=ctx)
    print(str(response2))

    state = await ctx.store.get("state")
    print("Name: ", state["name"])


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

可能的输出

<think>
Okay, the user is asking, "What is my name?" Let me check the current state. The state shows that the name is 'unset'. That means the user hasn't provided their name yet. I need to prompt them to set their name. The function available is set_name, which requires a name parameter. Since the name isn't set, I should ask the user to provide it. I'll respond by asking them to tell me their name so I can set it for them.
</think>

Your name is currently unset. Please provide your name so I can set it for you.
<think>
Okay, the user provided their name as "shuheng". I need to use the set_name function to update the state. The function requires the name parameter, so I'll pass "shuheng" into it. Once the function is called, the state should change from 'unset' to 'shuheng'. I'll make sure the JSON is correctly formatted and then return the tool call.
</think>

Your name has been successfully set to **shuheng**. Let me know if you need anything else!
Name:  shuheng

流式输出

通过循环 handler.stream_events 可以得到 Agent 执行过程中的类型的各种输出

# 其他基础代码忽略,同上
from llama_index.core.agent.workflow import (
    AgentInput,
    AgentOutput,
    ToolCall,
    ToolCallResult,
    AgentStream,
)
async def main():
    handler = workflow.run(user_msg="What is 20+(2*4)?")
    # handle streaming output
    async for event in handler.stream_events():
        if isinstance(event, AgentStream):
            print(event.delta, end="", flush=True)
        elif isinstance(event, AgentInput):
            print("Agent input: ", event.input)  # the current input messages
            print("Agent name:", event.current_agent_name)  # the current agent name
        elif isinstance(event, AgentOutput):
            print("Agent output: ", event.response)  # the current full response
            print(
                "Tool calls made: ", event.tool_calls
            )  # the selected tool calls, if any
            print("Raw LLM response: ", event.raw)  # the raw llm api response
        elif isinstance(event, ToolCallResult):
            print("Tool called: ", event.tool_name)  # the tool name
            print("Arguments to the tool: ", event.tool_kwargs)  # the tool kwargs
            print("Tool output: ", event.tool_output)  # the tool output
            # print final output
    print(str(await handler))


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

可能的输出

Agent input:  [ChatMessage(role=<MessageRole.SYSTEM: 'system'>, additional_kwargs={}, blocks=[TextBlock(block_type='text', text='You are an agent that can perform basic mathematical operations using tools.')]), ChatMessage(role=<MessageRole.USER: 'user'>, additional_kwargs={}, blocks=[TextBlock(block_type='text', text='What is 20+(2*4)?')])]
Agent name: Agent
<think>
Okay, let's see. The user is asking for 20 plus the product of 2 and 4. First, I need to handle the multiplication part because of the parentheses. The expression inside the parentheses is 2*4, which equals 8. Then, I add that result to 20. So 20 + 8 gives 28. To use the tools provided, I should first call the multiply function with 2 and 4, then use the add function with 20 and the result from the multiply. Let me check the functions again to make sure. The multiply function takes two numbers and returns their product. The add function does the same for addition. So the steps are correct. The final answer should be 28.
</think>

Agent output:  assistant: <think>
Okay, let's see. The user is asking for 20 plus the product of 2 and 4. First, I need to handle the multiplication part because of the parentheses. The expression inside the parentheses is 2*4, which equals 8. Then, I add that result to 20. So 20 + 8 gives 28. To use the tools provided, I should first call the multiply function with 2 and 4, then use the add function with 20 and the result from the multiply. Let me check the functions again to make sure. The multiply function takes two numbers and returns their product. The add function does the same for addition. So the steps are correct. The final answer should be 28.
</think>


Tool calls made:  [ToolSelection(tool_id='multiply', tool_name='multiply', tool_kwargs={'a': 2, 'b': 4}), ToolSelection(tool_id='add', tool_name='add', tool_kwargs={'a': 20, 'b': 8})]
Raw LLM response:  {'model': 'qwen3:32b', 'created_at': '2025-11-14T14:06:54.386886038Z', 'done': True, 'done_reason': 'stop', 'total_duration': 46510883925, 'load_duration': 10250473144, 'prompt_eval_count': 265, 'prompt_eval_duration': 1080081753, 'eval_count': 232, 'eval_duration': 35174053918, 'message': Message(role='assistant', content='', thinking=None, images=None, tool_name=None, tool_calls=None), 'usage': {'prompt_tokens': 265, 'completion_tokens': 232, 'total_tokens': 497}}
Tool called:  multiply
Arguments to the tool:  {'a': 2, 'b': 4}
Tool output:  8
Tool called:  add
Arguments to the tool:  {'a': 20, 'b': 8}
Tool output:  28
Agent input:  [ChatMessage(role=<MessageRole.SYSTEM: 'system'>, additional_kwargs={}, blocks=[TextBlock(block_type='text', text='You are an agent that can perform basic mathematical operations using tools.')]), ChatMessage(role=<MessageRole.USER: 'user'>, additional_kwargs={}, blocks=[TextBlock(block_type='text', text='What is 20+(2*4)?')]), ChatMessage(role=<MessageRole.ASSISTANT: 'assistant'>, additional_kwargs={'tool_calls': [{'function': Function(name='multiply', arguments={'a': 2, 'b': 4})}, {'function': Function(name='add', arguments={'a': 20, 'b': 8})}]}, blocks=[TextBlock(block_type='text', text="<think>\nOkay, let's see. The user is asking for 20 plus the product of 2 and 4. First, I need to handle the multiplication part because of the parentheses. The expression inside the parentheses is 2*4, which equals 8. Then, I add that result to 20. So 20 + 8 gives 28. To use the tools provided, I should first call the multiply function with 2 and 4, then use the add function with 20 and the result from the multiply. Let me check the functions again to make sure. The multiply function takes two numbers and returns their product. The add function does the same for addition. So the steps are correct. The final answer should be 28.\n</think>\n\n")]), ChatMessage(role=<MessageRole.TOOL: 'tool'>, additional_kwargs={'tool_call_id': 'multiply'}, blocks=[TextBlock(block_type='text', text='8')]), ChatMessage(role=<MessageRole.TOOL: 'tool'>, additional_kwargs={'tool_call_id': 'add'}, blocks=[TextBlock(block_type='text', text='28')])]
Agent name: Agent
<think>
Okay, let's see. The user asked for 20 + (2*4). First, I need to calculate the multiplication part because of the parentheses. So 2 multiplied by 4 is 8. Then add that result to 20. 20 plus 8 equals 28. The tools provided are multiply and add functions. I used multiply first with 2 and 4, got 8, then added 20 and 8 using the add function to get 28. That's the correct answer.
</think>

The result of $20 + (2 \times 4)$ is $\boxed{28}$.Agent output:  assistant: <think>
Okay, let's see. The user asked for 20 + (2*4). First, I need to calculate the multiplication part because of the parentheses. So 2 multiplied by 4 is 8. Then add that result to 20. 20 plus 8 equals 28. The tools provided are multiply and add functions. I used multiply first with 2 and 4, got 8, then added 20 and 8 using the add function to get 28. That's the correct answer.
</think>

The result of $20 + (2 \times 4)$ is $\boxed{28}$.
Tool calls made:  []
Raw LLM response:  {'model': 'qwen3:32b', 'created_at': '2025-11-14T14:07:15.593715997Z', 'done': True, 'done_reason': 'stop', 'total_duration': 21166778613, 'load_duration': 53533247, 'prompt_eval_count': 453, 'prompt_eval_duration': 42859601, 'eval_count': 139, 'eval_duration': 21032738879, 'message': Message(role='assistant', content='', thinking=None, images=None, tool_name=None, tool_calls=None), 'usage': {'prompt_tokens': 453, 'completion_tokens': 139, 'total_tokens': 592}}
<think>
Okay, let's see. The user asked for 20 + (2*4). First, I need to calculate the multiplication part because of the parentheses. So 2 multiplied by 4 is 8. Then add that result to 20. 20 plus 8 equals 28. The tools provided are multiply and add functions. I used multiply first with 2 and 4, got 8, then added 20 and 8 using the add function to get 28. That's the correct answer.
</think>

The result of $20 + (2 \times 4)$ is $\boxed{28}$.

人工干预

from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.core.workflow import Context
from llama_index.llms.ollama import Ollama
from llama_index.core.agent.workflow import (
    AgentStream,
)
from llama_index.core.workflow import (
    InputRequiredEvent,
    HumanResponseEvent,
)

llm = Ollama(model="qwen3:32b", base_url="http://ollama-ai:40792")


async def dangerous_task(ctx: Context) -> str:
    """A dangerous task that requires human confirmation."""

    # emit an event to the external stream to be captured
    ctx.write_event_to_stream(
        InputRequiredEvent(
            prefix="Are you sure you want to proceed? ",
            user_name="Laurie",
        )
    )

    # wait until we see a HumanResponseEvent
    response = await ctx.wait_for_event(
        HumanResponseEvent, requirements={"user_name": "Laurie"}
    )

    # act on the input from the event
    if response.response.strip().lower() == "yes":
        return "Dangerous task completed successfully."
    else:
        return "Dangerous task aborted."


workflow = AgentWorkflow.from_tools_or_functions(
    [dangerous_task],
    llm=llm,
    system_prompt="You are a helpful assistant that can perform dangerous tasks.",
)

async def main():
    handler = workflow.run(user_msg="I want to proceed with the dangerous task.")

    async for event in handler.stream_events():
        if isinstance(event, AgentStream):
            print(event.delta, end="", flush=True)
        elif isinstance(event, InputRequiredEvent):
            # capture keyboard input
            response = input(event.prefix)
            # send our response back
            handler.ctx.send_event(
                HumanResponseEvent(
                    response=response,
                    user_name=event.user_name,
                )
            )

    response = await handler
    print(str(response))

if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

多 Agent

利用Web search 工具和函数工具,构建多个 Agent,互相调用

from llama_index.llms.ollama import Ollama
from dotenv import load_dotenv

from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.core.workflow import Context
from llama_index.core.agent.workflow import (
    AgentOutput,
    ToolCall,
    ToolCallResult,
)
from llama_index.tools.tavily_research import TavilyToolSpec
from llama_index.core.agent.workflow import FunctionAgent
import os

load_dotenv()

tavily_tool = TavilyToolSpec(api_key=os.getenv("TAVILY_API_KEY"))
search_web = tavily_tool.to_tool_list()[0]
llm = Ollama(model="qwen3:14b", base_url="http://ollama-ai:40792")


async def record_notes(ctx: Context, notes: str, notes_title: str) -> str:
    """Useful for recording notes on a given topic."""
    current_state = await ctx.store.get("state")
    if "research_notes" not in current_state:
        current_state["research_notes"] = {}
    current_state["research_notes"][notes_title] = notes
    await ctx.store.set("state", current_state)
    return "Notes recorded."


async def write_report(ctx: Context, report_content: str) -> str:
    """Useful for writing a report on a given topic."""
    current_state = await ctx.store.get("state")
    current_state["report_content"] = report_content
    await ctx.store.set("state", current_state)
    return "Report written."


async def review_report(ctx: Context, review: str) -> str:
    """Useful for reviewing a report and providing feedback."""
    current_state = await ctx.store.get("state")
    current_state["review"] = review
    await ctx.store.set("state", current_state)
    return "Report reviewed."


research_agent = FunctionAgent(
    name="ResearchAgent",
    description="Useful for searching the web for information on a given topic and recording notes on the topic.",
    system_prompt=(
        "You are the ResearchAgent that can search the web for information on a given topic and record notes on the topic. "
        "Once notes are recorded and you are satisfied, you should hand off control to the WriteAgent to write a report on the topic."
    ),
    llm=llm,
    tools=[search_web, record_notes],
    can_handoff_to=["WriteAgent"],
)

write_agent = FunctionAgent(
    name="WriteAgent",
    description="Useful for writing a report on a given topic.",
    system_prompt=(
        "You are the WriteAgent that can write a report on a given topic. "
        "Your report should be in a markdown format. The content should be grounded in the research notes. "
        "Once the report is written, you should get feedback at least once from the ReviewAgent."
    ),
    llm=llm,
    tools=[write_report],
    can_handoff_to=["ReviewAgent", "ResearchAgent"],
)

review_agent = FunctionAgent(
    name="ReviewAgent",
    description="Useful for reviewing a report and providing feedback.",
    system_prompt=(
        "You are the ReviewAgent that can review a report and provide feedback. "
        "Your feedback should either approve the current report or request changes for the WriteAgent to implement."
    ),
    llm=llm,
    tools=[review_report],
    can_handoff_to=["WriteAgent"],
)

agent_workflow = AgentWorkflow(
    agents=[research_agent, write_agent, review_agent],
    root_agent=research_agent.name,
    initial_state={
        "research_notes": {},
        "report_content": "Not written yet.",
        "review": "Review required.",
    },
)


async def main():
    handler = agent_workflow.run(
        user_msg="""
        Write me a report on the history of the web. Briefly describe the history
        of the world wide web, including the development of the internet and the
        development of the web, including 21st century developments.
    """
    )

    current_agent = None
    current_tool_calls = ""
    async for event in handler.stream_events():
        if (
            hasattr(event, "current_agent_name")
            and event.current_agent_name != current_agent
        ):
            current_agent = event.current_agent_name
            print(f"\n{'=' * 50}")
            print(f"🤖 Agent: {current_agent}")
            print(f"{'=' * 50}\n")
        elif isinstance(event, AgentOutput):
            if event.response.content:
                print("📤 Output:", event.response.content)
            if event.tool_calls:
                print(
                    "🛠️  Planning to use tools:",
                    [call.tool_name for call in event.tool_calls],
                )
        elif isinstance(event, ToolCallResult):
            print(f"🔧 Tool Result ({event.tool_name}):")
            print(f"  Arguments: {event.tool_kwargs}")
            print(f"  Output: {event.tool_output}")
        elif isinstance(event, ToolCall):
            print(f"🔨 Calling Tool: {event.tool_name}")
            print(f"  With arguments: {event.tool_kwargs}")


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

可能的结果:

==================================================
🤖 Agent: ResearchAgent
==================================================

📤 Output: <think>
Okay, the user wants a report on the history of the web, including the development of the internet and the web itself, up to the 21st century. Let me start by breaking down what I need to cover.

First, I should figure out the key events in the history of the internet and the World Wide Web. The internet's origins are in the 1960s with ARPANET, right? Then TCP/IP in the 70s, the creation of the first web browser by Tim Berners-Lee in the 80s, and the commercialization in the 90s. For the 21st century, things like social media, mobile internet, and the rise of cloud computing come to mind.

Wait, but I need to make sure I have accurate dates and events. Maybe I should use the search function to find reliable information. Let me start by searching for the history of the internet and the web. Let me do a search for "history of the internet and world wide web" to get some key points.

After getting the search results, I'll need to extract the main events. Then, I should structure the report chronologically, starting from the early days of ARPANET, moving through the development of TCP/IP, the invention of HTML and the first web browser, the growth of the web in the 90s, and then major developments in the 21st century like the rise of smartphones, social media platforms, and recent trends like AI integration.

I should also check for important milestones in the 21st century, such as the proliferation of broadband, the emergence of Web 2.0, the importance of search engines, and maybe the impact of the COVID-19 pandemic on internet usage. Oh, and the evolution from desktop to mobile browsing, the role of companies like Google, Facebook, and Twitter, and the development of technologies like HTTPS and the shift to more secure web practices.

Wait, but I need to ensure that the information is up-to-date. Maybe I should do a separate search for 21st-century developments to confirm the latest trends. Let me perform another search specifically on "21st century web developments" to get detailed information on that part.

Once I have all the necessary information, I can organize it into sections: Early Internet (1960s-1980s), The Birth of the Web (1990s), Expansion and Commercialization (late 90s-2000s), 21st Century Innovations (2000s onwards), and maybe a conclusion. Each section should briefly describe the key events and technologies.

After gathering all the information, I'll need to record the notes using the record_notes function. Then, I can hand off to the WriteAgent to compose the report based on the notes. Let me make sure I have all the critical points covered and that the information is accurate before proceeding.
</think>


🛠️  Planning to use tools: ['search']
🔨 Calling Tool: search
  With arguments: {'max_results': 6, 'query': 'history of the internet and world wide web'}
🔧 Tool Result (search):
  Arguments: {'max_results': 6, 'query': 'history of the internet and world wide web'}
  Output: The history of the Internet originated in the efforts of scientists and engineers to build and interconnect computer networks. The Internet Protocol Suite, the set of rules used to communicate between networks and devices on the Internet, arose from research and development in the United States and involved international collaboration, particularly with researchers in the United Kingdom and France. [...] Research at CERN in Switzerland by the British computer scientist Tim Berners-Lee in 1989–90 resulted in the World Wide Web, linking hypertext documents into an information system, accessible from any node "Node (networking)") on the network. The dramatic expansion of the capacity of the Internet, enabled by the advent of wave division multiplexing (WDM) and the rollout of fiber optic cables in the mid-1990s, had a revolutionary impact on culture, commerce, and technology. This made possible [...] in Menlo Park, California at 22:30 hours on October 29, 1969.
Websites for use by the general public began to emerge in 1993–94. This spurred competition in server and browser software, highlighted in the Browser wars which was initially dominated by Netscape Navigator and Internet Explorer. Following the complete removal of commercial restrictions on Internet use by 1995, commercialization of the Web amidst macroeconomic factors led to the dot-com boom and bust in the late 1990s and early 2000s. [...] During the 1980s, many packet-switched data networks emerged based on various communication protocols (see Protocol Wars). One of these standards was the Internet protocol suite, which is often referred to as TCP/IP. As the Internet grew through the 1980s, many people realized the increasing need to be able to find and organize files and use information. By 1985, the Domain Name System (upon which the Uniform Resource Locator is built) came into being.[better source needed][failed verification] [...] The World Wide Web enabled the spread of information over the Internet through an easy-to-use and flexible format. It thus played an important role in popularising use of the Internet. Although the two terms are sometimes conflated in popular use, World Wide Web is not synonymous with Internet. The Web is an information space containing hyperlinked documents and other resources, identified by their URIs. It is implemented as both client and server software using Internet protocols such as
Brief History of the Internet, Internet Society
 Internet History 1962 to 1992, Computer History Museum
 Internet Pioneers, ibiblio
 Tim Berners-Lee biography, World Wide Web Consortium
 The World Wide Web: A global information space, Science Museum

### Books

 John Naughton, A Brief History of the Future: The Origins of the Internet, 1999
 Katie Hafner and Matthew Lyon, Where Wizards Stay Up Late: The Origins of the Internet, 1996
 Tim Berners-Lee, Weaving the Web, 1999 [...] The launch of the Mosaic browser in 1993 opened up the web to a new audience of non-academics, and people started to discover how easy it was to create their own HTML web pages. Consequently, the number of websites grew from 130 in 1993 to over 100,000 at the start of 1996.

By 1995 the internet and the World Wide Web were established phenomena: Netscape Navigator, which was the most popular browser at the time, had around 10 million global users. [...] The origins of the internet are rooted in the USA of the 1950s. The Cold War was at its height and huge tensions existed between North America and the Soviet Union. Both superpowers were in possession of deadly nuclear weapons, and people lived in fear of long-range surprise attacks. The US realised it needed a communications system that could not be affected by a Soviet nuclear attack.
The Internet is as much a collection of communities as a collection of technologies, and its success is largely attributable to both satisfying basic community needs as well as utilizing the community in an effective way to push the infrastructure forward. This community spirit has a long history beginning with the early ARPANET. The early ARPANET researchers worked as a close-knit community to accomplish the initial demonstrations of packet switching technology described earlier. Likewise, the [...] The original ARPANET grew into the Internet. Internet was based on the idea that there would be multiple independent networks of rather arbitrary design, beginning with the ARPANET as the pioneering packet switching network, but soon to include packet satellite networks, ground-based packet radio networks and other networks. The Internet as we now know it embodies a key underlying technical idea, namely that of open architecture networking. In this approach, the choice of any individual network [...] This was the beginning of long term experimentation and development to evolve and mature the Internet concepts and technology. Beginning with the first three networks (ARPANET, Packet Radio, and Packet Satellite) and their initial research communities, the experimental environment has grown to incorporate essentially every form of network and a very broad-based research and development community. ( With each expansion has come new challenges.
Tim Berners-Lee, a British scientist, invented the World Wide Web (WWW) in 1989, while working at CERN. The Web was originally conceived and developed to meet the demand for automated information-sharing between scientists in universities and institutes around the world. [...] Tim Berners-Lee wrote the first proposal for the World Wide Web in March 1989 and his second proposal in May 1990. Together with Belgian systems engineer Robert Cailliau, this was formalised as a management proposal in November 1990. This outlined the principal concepts and it defined important terms behind the Web. The document described a "hypertext project" called "WorldWideWeb" in which a "web" of "hypertext documents" could be viewed by “browsers”. [...] WWW. The European Commission approved its first web project (WISE) at the end of the same year, with CERN as one of the partners. On 30 April 1993, CERN made the source code of WorldWideWeb available on a royalty-free basis, making it free software. By late 1993 there were over 500 known web servers, and the WWW accounted for 1% of internet traffic, which seemed a lot in those days (the rest was remote access, e-mail and file transfer). 1994 was the “Year of the Web”. Initiated by Robert
(2012). Evolution of the World Wide Web : From Web 1.0 to Web 4.0. International journal of Web & Semantic T echnology, 3(1), pp.1-10.  Choudhury, N. (2014). World Wide Web and Its Journey from Web 1.0 to Web 4.0. International Journal of Computer Science and Information T echnologies.  Tim Berners-Lee, “The World Wide Web: A very short personal history”,  , 1998.  Keshab Nath, Sourish Dhar, Subhash Basishtha. Web 1.0 to Web 3.0 - Evolution of the Web and its various challenges, February 2014. [...] INTERNATIONAL JOURNAL OF SCIENTIFIC & TECHNOLOGY RESEARCH VOLUME 8, ISSUE 09, SEPTEMBER 2019 ISSN 2277-8616 75 IJSTR©2019 www.ijstr.org Development History Of The World Wide Web Karwan Jacksi, Shakir M. Abass Abstract: There are many technologies which are used on the Internet to share files, each of them have different features, methods and protocols. However, the most common and easiest one is the Web which was established by few simple features. The Web continuously developing to be as much [...] Internet of Things". . Fig.1 shown the stage of web. In this paper explain history of web in details and we compared each version with other. 2 OVERVIEW The web such as global database that user can share information through his device connected to the internet . There are many of resources explain the stages of the Web technology through its development whenever it is become easier for users it is become more complex for developer. The web is involved from simple to more advance structures.
undefined
undefined

Released under the MIT License.