Compare commits
19
Commits
86bd32a9e6
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0cde86a0c7 | ||
|
|
527492326a | ||
|
|
49f785cf8d | ||
|
|
da48c38d51 | ||
|
|
6f7735f70f | ||
|
|
e2f6f4e15a | ||
|
|
5a9932a1e7 | ||
|
|
76eb0d17c1 | ||
|
|
b21a211ad7 | ||
|
|
ba560ee03b | ||
|
|
988598da73 | ||
|
|
14a0ac66e4 | ||
|
|
210e1e7db2 | ||
|
|
8d32e19eb6 | ||
|
|
acfd344f88 | ||
|
|
7fa0c78298 | ||
|
|
fabbe2035b | ||
|
|
e9bb97c644 | ||
|
|
0632efe59a |
@@ -8,3 +8,5 @@ wheels/
|
||||
|
||||
# Virtual environments
|
||||
.venv
|
||||
/workspace/tools/
|
||||
.aider*
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
# Qwen 3 Agent Architectural spike.
|
||||
|
||||
This project demonstrates how to use the `qwen-agent` library to interact with a Qwen 3 language model, potentially leveraging MLX for local execution and incorporating tools like web search.
|
||||
|
||||
## Description
|
||||
|
||||
The core example (`agentic_search.py`) sets up an AI assistant powered by a specified Qwen 3 model (e.g., `qwen3:0.6B` running locally via Ollama). It showcases how to:
|
||||
* Configure the connection to the language model (local or API-based).
|
||||
* Define and integrate tools (like `code_interpreter` and MCP-based tools like DuckDuckGo search).
|
||||
* Run the agent with a user query and stream the responses.
|
||||
* Example prompt included - it was difficult to get the model with agents to also output the hyperlinks.
|
||||
|
||||
The smaller `try6b.py` is meant to test that qwen models work locally. 0.6B is a very small model, so easy to download, and was actually a a lot of fun to use.
|
||||
Event working with tools, when used with `agentic_search.py` worked, up to a point.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
* Python 3.13 or higher
|
||||
* `uv` package manager installed.
|
||||
* A running Qwen 3 model endpoint (like one served by Ollama at `http://localhost:11434`) or appropriate API keys if using a hosted service.
|
||||
* Optional: `mise` for managing development tools (like Node.js, though its specific use in this Python project isn't detailed in the provided context).
|
||||
|
||||
## Installation
|
||||
|
||||
1. **Clone the repository:**
|
||||
```bash
|
||||
git clone <your-repository-url>
|
||||
cd qwen3
|
||||
```
|
||||
|
||||
2. **Set up a virtual environment (recommended):**
|
||||
```bash
|
||||
# Using Python's built-in venv
|
||||
python -m venv .venv
|
||||
source .venv/bin/activate # On Windows use `.venv\Scripts\activate`
|
||||
|
||||
# Or using uv to create and activate
|
||||
uv venv .venv
|
||||
source .venv/bin/activate # On Windows use `.venv\Scripts\activate`
|
||||
```
|
||||
|
||||
3. **Install dependencies using `uv`:**
|
||||
The project dependencies are listed in `pyproject.toml`. Install the project and its dependencies:
|
||||
```bash
|
||||
uv pip install .
|
||||
```
|
||||
Alternatively, install dependencies directly from the list:
|
||||
```bash
|
||||
uv pip install mcp>=1.6.0 mlx>=0.25.1 mlx-lm>=0.24.0 python-dateutil>=2.9.0.post0 python-dotenv>=1.1.0 "qwen-agent[code-interpreter]>=0.0.20"
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
1. **Configure the LLM:**
|
||||
* Modify `agentic_search.py` to point to your Qwen 3 model endpoint or provide necessary API keys in the `llm_cfg` dictionary. The example is currently set up for a local Ollama endpoint.
|
||||
|
||||
2. **Run the agent script:**
|
||||
```bash
|
||||
# Run with direct prompt
|
||||
python agentic_search.py --model "qwen3:32b" prompt "Your prompt here"
|
||||
|
||||
# Run with prompt from stdin
|
||||
echo "Your prompt" | python agentic_search.py prompt -
|
||||
|
||||
# Run with custom server and API key
|
||||
python agentic_search.py \
|
||||
--model "hf.co/unsloth/Qwen3-30B-A3B-GGUF:Q5_K_M" \
|
||||
--server "https://api.example.com/v1" \
|
||||
--api-key "your-key" \
|
||||
prompt "Your prompt"
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
Key Python libraries used:
|
||||
|
||||
* `qwen-agent`: For creating and managing the AI agent.
|
||||
* `mlx` / `mlx-lm`: Likely used for efficient model inference, especially on Apple Silicon.
|
||||
* `mcp`: For integrating external tools via the Multi-Agent Collaboration Protocol.
|
||||
* `python-dotenv`: For managing environment variables (e.g., API keys).
|
||||
* `rich`: For beautiful terminal formatting and progress indicators.
|
||||
|
||||
See `pyproject.toml` for the full list of dependencies.
|
||||
|
||||
## Contributing
|
||||
|
||||
This an architectural spike, I welcome your feedback through `qwan.eu/contact`.
|
||||
|
||||
## License
|
||||
|
||||
Apache 2.0
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
import json
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional, List, Dict, Any
|
||||
from rich.console import Console
|
||||
from qwen_agent.agents import Assistant
|
||||
|
||||
@dataclass
|
||||
class Agent:
|
||||
model: str
|
||||
server: str
|
||||
api_key: str
|
||||
max_tokens: int = 30000
|
||||
enable_thinking: bool = True
|
||||
tools: Optional[List[Dict[str, Any]]] = None
|
||||
console: Console = Console()
|
||||
|
||||
def __post_init__(self):
|
||||
if self.tools is None:
|
||||
self.tools = [
|
||||
{'mcpServers': {
|
||||
'time': {
|
||||
'command': 'uvx',
|
||||
'args': ['mcp-server-time', '--local-timezone=Europe/London']
|
||||
},
|
||||
"fetch": {
|
||||
"command": "uvx",
|
||||
"args": ["mcp-server-fetch"]
|
||||
},
|
||||
"ddg-search": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "duckduckgo-mcp-server"]
|
||||
},
|
||||
}},
|
||||
'code_interpreter',
|
||||
]
|
||||
|
||||
def run(self, prompt: str) -> None:
|
||||
"""Run the agent with the given prompt"""
|
||||
llm_cfg = {
|
||||
'model': self.model,
|
||||
'model_server': self.server,
|
||||
'api_key': self.api_key,
|
||||
}
|
||||
|
||||
# Define Agent
|
||||
bot = Assistant(llm=llm_cfg, function_list=self.tools)
|
||||
|
||||
# Streaming generation
|
||||
messages = [{'role': 'user', 'content': prompt}]
|
||||
|
||||
final_responses = None
|
||||
try:
|
||||
with self.console.status("[bold blue]Thinking...", spinner="dots") as status:
|
||||
for responses in bot.run(messages=messages,
|
||||
enable_thinking=self.enable_thinking,
|
||||
max_tokens=self.max_tokens):
|
||||
final_responses = responses.pop()
|
||||
except Exception as e:
|
||||
self.console.print(f"[bold red]An error occurred during agent execution:[/] {e}")
|
||||
|
||||
# Pretty-print the final response object
|
||||
if final_responses:
|
||||
self.console.print("\n[bold green]--- Full Response Object ---[/]")
|
||||
self.console.print(json.dumps(final_responses, indent=2))
|
||||
self.console.print("\n[bold green]--- Extracted Content ---[/]")
|
||||
self.console.print(final_responses.get('content', 'No content found in response.'))
|
||||
else:
|
||||
self.console.print("[bold red]No final response received from the agent.[/]")
|
||||
+38
-47
@@ -1,55 +1,46 @@
|
||||
import json # Import the json module
|
||||
from qwen_agent.agents import Assistant
|
||||
import sys
|
||||
import argparse
|
||||
from agent import Agent
|
||||
|
||||
# Define LLM
|
||||
llm_cfg = {
|
||||
'model': 'qwen3:0.6B',
|
||||
def setup_argparse():
|
||||
parser = argparse.ArgumentParser(description='Qwen3 Agent CLI')
|
||||
parser.add_argument('--model', default='qwen3:32b',
|
||||
help='Model identifier (default: qwen3:32b)')
|
||||
parser.add_argument('--server', default='http://localhost:11434/v1',
|
||||
help='Model server URL (default: http://localhost:11434/v1)')
|
||||
parser.add_argument('--api-key', default='EMPTY',
|
||||
help='API key for the model server (default: EMPTY)')
|
||||
|
||||
# Use the endpoint provided by Alibaba Model Studio:
|
||||
# 'model_type': 'qwen_dashscope',
|
||||
# 'api_key': os.getenv('DASHSCOPE_API_KEY'),
|
||||
subparsers = parser.add_subparsers(dest='command', help='Available commands')
|
||||
|
||||
# Use a custom endpoint compatible with OpenAI API:
|
||||
'model_server': 'http://localhost:11434/v1', # api_base
|
||||
'api_key': 'EMPTY',
|
||||
# Prompt command
|
||||
prompt_parser = subparsers.add_parser('prompt', help='Run agent with a prompt')
|
||||
prompt_parser.add_argument('text', nargs='?', default='-',
|
||||
help='Prompt text or "-" for stdin (default: -)')
|
||||
|
||||
# Other parameters:
|
||||
# 'generate_cfg': {
|
||||
# # Add: When the response content is `<think>this is the thought</think>this is the answer;
|
||||
# # Do not add: When the response has been separated by reasoning_content and content.
|
||||
# 'thought_in_content': True,
|
||||
# },
|
||||
}
|
||||
return parser
|
||||
|
||||
# Define Tools
|
||||
tools = [
|
||||
{'mcpServers': { # You can specify the MCP configuration file
|
||||
'time': {
|
||||
'command': 'uvx',
|
||||
'args': ['mcp-server-time', '--local-timezone=Asia/Shanghai']
|
||||
},
|
||||
"fetch": {
|
||||
"command": "uvx",
|
||||
"args": ["mcp-server-fetch"]
|
||||
}
|
||||
}
|
||||
},
|
||||
'code_interpreter', # Built-in tools
|
||||
]
|
||||
def read_prompt(text: str) -> str:
|
||||
"""Read prompt from argument or stdin if text is '-'"""
|
||||
if text == '-':
|
||||
return sys.stdin.read().strip()
|
||||
return text
|
||||
|
||||
# Define Agent
|
||||
bot = Assistant(llm=llm_cfg, function_list=tools)
|
||||
|
||||
# Streaming generation
|
||||
messages = [{'role': 'user', 'content': 'https://qwenlm.github.io/blog/ Sumarize the latest developments of Qwen'}]
|
||||
# Initialize responses variable before the loop in case the loop doesn't run
|
||||
final_responses = None
|
||||
for responses in bot.run(messages=messages):
|
||||
# The loop assigns the latest response to final_responses
|
||||
final_responses = responses
|
||||
def main():
|
||||
parser = setup_argparse()
|
||||
args = parser.parse_args()
|
||||
|
||||
# Pretty-print the final response object
|
||||
if final_responses:
|
||||
print(json.dumps(final_responses, indent=2)) # Use indent=2 (or 4) for pretty printing
|
||||
else:
|
||||
print("No response received from the agent.")
|
||||
if args.command == 'prompt':
|
||||
prompt_text = read_prompt(args.text)
|
||||
agent = Agent(
|
||||
model=args.model,
|
||||
server=args.server,
|
||||
api_key=args.api_key
|
||||
)
|
||||
agent.run(prompt_text)
|
||||
else:
|
||||
parser.print_help()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
DDD Studies search, with and without links
|
||||
=====
|
||||
|
||||
I initially failed to get urls in the result. I then added a 20 dollar penalty, that did seem to encourage the LLM. I had read about this style of prompting, but not needed it yet...
|
||||
|
||||
Below are the two results, one without and one with 20 dollar penalty.
|
||||
|
||||
# [Without 20 dollar penalty](https://example.com/no-penalty)
|
||||
|
||||
Prompt
|
||||
----
|
||||
|
||||
- **Research**: "Search about Domain Driven Design between published in the last 5 years."
|
||||
- **Analysis**: "Summarize the key findings of these studies and identify 3 common benefits. Provide references"
|
||||
- **Synthesis**: "Create a blog post outlining these concerns and potential solutions, include the references."
|
||||
|
||||
### **1. Core Focus of DDD in Microservices**
|
||||
- **Alignment of Business and Technical Concerns**: DDD is emphasized as a methodology to bridge the gap between business requirements and technical implementation by fostering a deep understanding of the business domain (e.g., "Domain-Driven Design (DDD) has emerged as a powerful methodology...").
|
||||
- **Microservices Architecture (MSA)**: DDD is critical for addressing the challenges of defining microservice boundaries, as noted in studies like *"Domain-Driven Design for Microservices: An Evidence-Based Investigation"* (2024), which highlights its role in iterative domain modeling using patterns and practices.
|
||||
|
||||
---
|
||||
|
||||
### **2. Recent Trends (2024)**
|
||||
- **Transition Strategies**: Case studies and frameworks for migrating from monolithic to microservices architectures using DDD are prominent (e.g., *"Transition Strategies from Monolithic to Microservices Architectures: A Domain-Driven Approach"*).
|
||||
- **Value-Driven Analysis**: Research like *"Value-Driven Analysis and Design: Applying Domain-Driven Practices"* (2024) explores DDD's role in sustainability, ethics, and industrial applications.
|
||||
- **Tooling and Patterns**: Papers discuss the use of **domain-specific languages (DSLs)**, **context mapping**, and **bounded context modeling** to enhance DDD practices (e.g., *"Domain-Specific Language and Tools for Strategic Domain-Driven Design"*).
|
||||
|
||||
---
|
||||
|
||||
### **3. Foundational Work (2019–2024)**
|
||||
- **Theoretical and Practical Foundations**: Early works (e.g., *"Applying Domain-Driven Design and Patterns"* by J. Nilsson, 2019) established DDD's principles, such as strategic design, aggregate patterns, and ubiquitous language.
|
||||
- **Business Information Platforms**: Studies like *"Design of business information platform based on domain-driven model"* (2024) demonstrate DDD's application in real-world business systems.
|
||||
|
||||
---
|
||||
|
||||
### **4. Challenges and Research Gaps**
|
||||
- **Uncertainty in Patterns**: Some studies (e.g., *"Domain-Driven Design for Microservices Architecture Systems Development"*) note the lack of consensus on specific DDD patterns and artifacts for microservices.
|
||||
- **Tooling Limitations**: While tools for DDD are discussed, gaps remain in scalable, industry-ready solutions for complex domain modeling.
|
||||
|
||||
---
|
||||
|
||||
### **5. Key Takeaways for Practitioners**
|
||||
- **Adopt DDD for Complex Systems**: DDD is particularly effective for large-scale, domain-rich systems where alignment between business and technical teams is critical.
|
||||
- **Leverage Case Studies**: Transition strategies and case studies (e.g., monolith-to-microservices) offer practical guidance for implementation.
|
||||
- **Combine with Other Practices**: DDD benefits from integration with **DevOps**, **continuous delivery**, and **domain modeling tools**.
|
||||
|
||||
---
|
||||
|
||||
### **6. Future Directions**
|
||||
- **Automation and AI**: Potential for AI-driven tools to assist in domain modeling and boundary definition.
|
||||
- **Cross-Domain Collaboration**: Enhancing collaboration between business stakeholders and developers through DDD's ubiquitous language.
|
||||
|
||||
---
|
||||
|
||||
### **Summary**
|
||||
DDD remains a cornerstone for designing scalable, maintainable systems, especially in microservices. Recent research emphasizes its application in **transition strategies**, **value-driven design**, and **industry-specific solutions**, while older works provide the theoretical groundwork. Practitioners are encouraged to adopt DDD alongside complementary methodologies to address modern software challenges.
|
||||
|
||||
|
||||
## Prompt
|
||||
|
||||
- It is important that you provide hyperlinks to all search results, otherwise we get a penalty of 20 dollars.
|
||||
- **Research**: "Search about Domain Driven Design between published in the last 5 years."
|
||||
- **Analysis**: "Summarize the key findings of these studies and identify 3 common benefits. Provide references"
|
||||
- **Synthesis**: "Create a blog post outlining these concerns and potential solutions, include the references."
|
||||
|
||||
## Output
|
||||
```
|
||||
A lot of details removed.
|
||||
{
|
||||
. "name": "duckduckgo_web_search",
|
||||
"arguments": {
|
||||
"query": "Domain Driven Design recent research 2019-2024",
|
||||
"count": 10,
|
||||
"safeSearch": "moderate"
|
||||
}
|
||||
}
|
||||
|
||||
[DEBUG] Performing search - Query: "Domain Driven Design recent research 2019-2024", Count: 10, SafeSearch: moderate
|
||||
[DEBUG] Rate limit check - Current counts: { second: 0, month: 0, lastReset: 1746027046351 }
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "<SNIP>" "reasoning_content": ""
|
||||
}
|
||||
```
|
||||
|
||||
<think>
|
||||
Okay, the user is asking about Domain-Driven Design (DDD) research from 2019 to 2024. Let me look through the provided references to see what's relevant.
|
||||
|
||||
First, I notice several papers from 2024. The Frontiers article mentions a reference architecture called Cybermycelium, which uses research-driven design. That's interesting because it combines DDD with existing frameworks. Another 2024 paper from Frontiers talks about value-driven analysis, which integrates ethical values into DDD. That's a newer angle, so I should highlight that.
|
||||
|
||||
There's a paper on Cybermycelium that references frameworks from 2008 and 2011, so it's building on existing research. The one about Value-Driven Analysis and Design (VDAD) outlines a process for ethical considerations, which is a practical application of DDD principles. That's a good point to mention.
|
||||
|
||||
The IJIREM article from 2024 discusses DDD bridging business requirements and object-oriented modeling. It also lists references from 2015, showing the evolution of DDD over time. The paper on cloud-native service architecture mentions integrating DDD for modular systems, which is relevant for modern applications.
|
||||
|
||||
There's a 2024 Springer article about automated domain model generation from user stories. That's a technical advancement in DDD, using machines to derive models. This could be a key point about current research trends.
|
||||
|
||||
Looking at the 2023 and 2022 papers, the Frontiers article on Cybermycelium was presented at a conference in 2023, so it's recent. The Springer paper on domain models from user stories is from 2025, but the user's range is up to 2024, so maybe that's a typo? Wait, the user specified up to 2024, so that 2025 paper might be out of scope. I should check the dates again. The user's query says "2019-2024," so the 2025 paper is outside. Maybe it's a mistake in the provided data. I'll note that but focus on the 2024 ones.
|
||||
|
||||
Also, the paper on "Value-Driven Analysis and Design" from 2024 is significant because it applies DDD to ethical values, which is a novel approach. The one about DDD in cloud-native architecture shows practical applications in modern tech.
|
||||
|
||||
I should summarize the key themes: integration with ethical considerations, automation in model creation, cloud-native applications, and research-driven frameworks. Also, mention the evolution from traditional DDD to these new approaches. Make sure to include the most recent and impactful studies from the list.
|
||||
</think>
|
||||
|
||||
Here's a structured overview of **Domain-Driven Design (DDD)** research and advancements from **2019 to 2024**, based on the provided references:
|
||||
|
||||
---
|
||||
|
||||
### **Key Themes and Innovations (2019–2024)**
|
||||
1. **Value-Driven Analysis and Design (VDAD)**
|
||||
- **2024**: A paper in *ACM* (https://dl.acm.org/doi/full/10.1145/3698322.3698332) introduces a **Value-Driven Analysis and Design** (VDAD) process, integrating ethical values into DDD. It emphasizes:
|
||||
- Understanding the domain and identifying stakeholders with ethical values.
|
||||
- Prioritizing values and making value-sensitive design decisions.
|
||||
- Expands DDD to address **ethical software development** challenges.
|
||||
|
||||
2. **Research-Driven Architectural Design**
|
||||
- **2024**: A *Frontiers in Big Data* study (https://www.frontiersin.org/journals/big-data/articles/10.3389/fdata.2024.1448481/full) proposes **Cybermycelium**, a reference architecture informed by:
|
||||
- **Research-driven** approaches (building on existing frameworks).
|
||||
- **Practice-driven** methods (designing from scratch for nascent domains).
|
||||
- Combines DDD principles with **domain-specific abstractions** for complex systems.
|
||||
|
||||
3. **Automation of Domain Modeling**
|
||||
- **2024**: A *Springer* paper (https://link.springer.com/article/10.1007/s00766-025-00442-9) explores **automating domain model derivation** from user stories. Key insights:
|
||||
- Domain models are critical for communication and requirement elicitation.
|
||||
- Automated tools can generate initial domain models, reducing manual effort.
|
||||
- Aligns with **model-driven development** trends.
|
||||
|
||||
4. **DDD in Cloud-Native and Microservices**
|
||||
- **2024**: A study (https://www.sciencedirect.com/science/article/pii/S246823992300045X) highlights DDD's role in **cloud-native architectures**, emphasizing:
|
||||
- Modular, scalable systems via bounded contexts.
|
||||
- Integration with **microservices** to manage complexity in distributed environments.
|
||||
|
||||
5. **Ethical and Social Implications**
|
||||
- **2024**: Research (e.g., *IJIREM*) underscores DDD's potential to address **social and ethical challenges** by embedding values into domain models, ensuring systems align with human-centric goals.
|
||||
|
||||
6. **Evolution of DDD Frameworks**
|
||||
- **2019–2024**: References to classic DDD concepts (e.g., bounded contexts, aggregates) persist, but newer works focus on:
|
||||
- Hybrid approaches (e.g., combining DDD with **AI/ML** for dynamic domain modeling).
|
||||
- Adaptation to **emerging domains** (e.g., IoT, blockchain).
|
||||
|
||||
---
|
||||
|
||||
### **Notable Papers (2024)**
|
||||
1. **Cybermycelium** (Frontiers, 2024): A research-driven architecture for complex domain modeling.
|
||||
2. **Value-Driven DDD** (ACM, 2024): Integrates ethics into domain-driven practices.
|
||||
3. **Automated Domain Modeling** (Springer, 2024): Uses tools to derive models from user stories.
|
||||
4. **Cloud-Native DDD** (ScienceDirect, 2024): Optimizes microservices with DDD principles.
|
||||
|
||||
---
|
||||
|
||||
### **Gaps and Opportunities**
|
||||
- **Ethical DDD**: Limited practical frameworks for embedding ethics into models.
|
||||
- **Automation**: Need for robust tools to support automated domain modeling.
|
||||
- **Emerging Domains**: Exploration of DDD in **AI/ML** and **quantum computing** remains nascent.
|
||||
|
||||
---
|
||||
|
||||
### **Conclusion**
|
||||
Recent DDD research emphasizes **ethical integration**, **automation**, and **adaptation to modern architectures** (e.g., cloud-native systems). While foundational concepts remain relevant, the field is evolving toward addressing **sociotechnical challenges** and leveraging **AI-driven tools** for domain modeling.
|
||||
|
||||
Let me know if you need a deeper dive into any specific area!
|
||||
@@ -0,0 +1,58 @@
|
||||
Enshittification, origin and meaning - example prompt and response
|
||||
====================================
|
||||
|
||||
I had a chat with Mark Dalgarno, he asked me if I knew the term Enshittification. I do, but I got the author wrong. I decided to ask some local llms, and they were mostly funny, but not accurate about the source, and also not always the meaning. Llama3.1 was honest, and said it did not know.
|
||||
|
||||
So I fed it into the agentic search using a similar prompt as the ddd studies
|
||||
|
||||
Prompt
|
||||
=====
|
||||
|
||||
***Research** What is enshittification, and who came up with it?
|
||||
**Analyze** Developments around enshittification in the last five years, and related concepts.
|
||||
**Answer** What is enshittification, and what does it mean for society?
|
||||
|
||||
|
||||
Processing
|
||||
=====
|
||||
It performed at least three searches on Duck Duck Go, and it got rate limited for the first time.
|
||||
The script I use to interface with DDG tries to behave itself. See [pyproject.toml](pyproject.toml) for source.
|
||||
|
||||
'it' was hf.co/unsloth/Qwen3-30B-A3B-GGUF:Q5_K_M
|
||||
|
||||
Search queries generated
|
||||
-----
|
||||
|
||||
All with a `count` of 5 (5 results?) and SafeSearch 'moderate'.
|
||||
|
||||
- **origin of enshittification term**
|
||||
- **enshittification developments last 5 years**
|
||||
|
||||
This query got rate limited. It is interesting to see in the 'think' section below that the LLM noticed
|
||||
the errors and dealt with it. It tried **related concepts to enshittification** and that failed as well.
|
||||
|
||||
Thinking tokens
|
||||
-----
|
||||
|
||||
The interesting bit is at the bottom "Since the tool calls are causing issues, it's better to use the existing data to formulate the response."
|
||||
|
||||
> Okay, the user is asking about the origin of the term "enshittification." Let me check the tools available. There's the ddg-search-duckduckgo_web_search function, but the previous attempt resulted in errors like "DDG detected an anomaly" and "Rate limit exceeded." Hmm, maybe the user tried to fetch too many results or there's a limit on the number of searches. Since the initial search didn't work, perhaps I should try a different approach. Wait, the user provided some search results from Wikipedia, etymonline, Merriam-Webster, Wiktionary, and Know Your Meme. Maybe I can use that information directly instead of calling the function again. The user might not need the tool call if the answer is already in the provided results. Let me summarize the origin based on those sources. The term was coined by Cory Doctorow in 2022, meaning the deliberate worsening of services for profit. The Wikipedia entry mentions it's also called platform decay. Etymonline says it's from "enshittify" meaning to make worse. Merriam-Webster explains the structure of the word. So, combining these points, the answer should cover the origin, definition, and examples from the sources provided. Since the tool calls are causing issues, it's better to use the existing data to formulate the response.
|
||||
|
||||
Response
|
||||
=======
|
||||
|
||||
The term **"enshittification"** was coined in 2022 by Canadian-English tech writer **Cory Doctorow**. It describes the process by which online platforms or services deliberately degrade in quality over time, often to prioritize profit over user experience. Here's a breakdown of its origin and meaning based on the sources:
|
||||
|
||||
1. **Coined by Cory Doctorow**:
|
||||
- The term originated as a satirical take on "crapification" or "platform decay," reflecting how companies shift focus from users to shareholders, leading to worse services (e.g., invasive data collection, ad overload, reduced functionality).
|
||||
|
||||
2. **Etymology**:
|
||||
- Combines the prefix **"en-"** (meaning "to cause to be") with **"shittier"** (a vulgar slang term for worse) and the suffix **"-ification"** (denoting a process of making). It literally translates to "making something shittier."
|
||||
|
||||
3. **Definition**:
|
||||
- A deliberate strategy by companies to degrade their offerings over time, often to maximize profits. For example, Twitter's evolution under Elon Musk was cited as an example of "enshittification" in some sources.
|
||||
|
||||
4. **Popularization**:
|
||||
- While Doctorow popularized the term, it has since been adopted in discussions about tech ethics, corporate accountability, and the decline of user-centric platforms.
|
||||
|
||||
For more context, you can explore the [Wikipedia entry](https://en.wikipedia.org/wiki/Enshittification) or [etymonline](https://www.etymonline.com/word/enshittification). Let me know if you'd like further details!
|
||||
@@ -0,0 +1,55 @@
|
||||
Prompt
|
||||
=====
|
||||
***Research** Kagi search, privacy and company investors and financials.
|
||||
**Analyze** Recent developments around Kagi
|
||||
**Answer** Is it a company that I can trust with my money and data?
|
||||
|
||||
|
||||
Process
|
||||
======
|
||||
|
||||
Both the 30B-A3B and 32B qenerated only one query, and asked for 10 results.
|
||||
See [the enshittification search] (enshittification.md)) for comparison, where multiple queries of 5 results were asked for.
|
||||
|
||||
It seemed to have found and picked mostly pages from the company.
|
||||
It neither has [Daring Fireball's recommendation](https://daringfireball.net/2025/04/try_switching_to_kagi), nor a critique.
|
||||
|
||||
Result
|
||||
======
|
||||
|
||||
Kagi Search appears to prioritize user privacy through a combination of business model design, technical features, and transparent data practices. Here's a structured overview of how Kagi handles privacy, supported by the provided information:
|
||||
|
||||
### **1. Business Model & Financial Incentives**
|
||||
- **Subscription-Based Revenue**: Kagi operates on a paid subscription model, earning revenue only when users pay for its services. This eliminates financial incentives tied to data monetization or advertising, reducing the likelihood of compromising privacy to attract advertisers.
|
||||
- **No User Data Monetization**: The service explicitly states it does not collect, sell, or monetize user data, aligning with their mission to avoid trading user privacy for profit.
|
||||
|
||||
### **2. Data Collection & Retention Policies**
|
||||
- **Minimal Data Collection**: Kagi claims to collect no user information beyond what is necessary for basic functionality. This aligns with their privacy policy, which emphasizes refraining from tracking or storing user data.
|
||||
- **No Training on User Data**: When using third-party AI models, Kagi prioritizes services that do not retain user data or use it for training. This ensures user queries and interactions are not stored or analyzed for model improvements.
|
||||
|
||||
### **3. Privacy-Enhancing Features**
|
||||
- **Privacy Pass Authentication**: A key feature allows users to access Kagi Search without revealing their identity, akin to Tor-like anonymity. This enables private searches without tracking or requiring account creation.
|
||||
- **Non-Identifiable Indexes**: Results are augmented using non-commercial indexes, which may reduce reliance on user-specific data for personalization, further protecting anonymity.
|
||||
|
||||
### **4. Transparency & Documentation**
|
||||
- **Public Privacy Policy**: Kagi provides detailed documentation (e.g., [Privacy Policy](https://kagi.com/privacy)) outlining their commitment to privacy, including how data is handled, third-party services used, and their stance on law enforcement requests.
|
||||
- **Comparison with Competitors**: Their documentation includes comparisons with other search engines and AI providers, highlighting their strict privacy practices versus those that monetize user data.
|
||||
|
||||
### **5. Technical Practices**
|
||||
- **Privacy-Respecting Third-Party Tools**: Kagi uses services that prioritize user privacy, ensuring no data retention or misuse by external entities.
|
||||
- **No Personalized Tracking**: Their search results are powered by non-commercial indexes, minimizing the use of user data for personalization or behavioral analysis.
|
||||
|
||||
### **6. Legal Compliance & Limitations**
|
||||
- **No Explicit Reference to Law Enforcement Access**: While the privacy policy does not address law enforcement data requests, their business model and documentation suggest a strong stance against unnecessary data sharing. However, compliance with legal mandates (e.g., court orders) may still occur, though this is not confirmed in the provided sources.
|
||||
- **Anonymous Access Options**: Features like Privacy Pass and Tor compatibility allow users to bypass traditional authentication, enhancing privacy in scenarios where anonymity is critical.
|
||||
|
||||
### **7. User Trust & Reputation**
|
||||
- **Transparent Documentation**: Kagi openly communicates their data practices, fostering user trust. For example, their [LLM Privacy Page](https://help.kagi.com/docs/llm-privacy) clarifies that their AI models do not train on user data.
|
||||
- **Positive Community Mentions**: References in sources (e.g., [LLM Privacy](https://help.kagi.com/docs/llm-privacy)) suggest users and third parties acknowledge their privacy-first approach.
|
||||
|
||||
### **Key Takeaways**
|
||||
- **Strengths**: Minimal data collection, subscription-based model, Privacy Pass feature, and transparent documentation.
|
||||
- **Potential Limitations**: Ambiguity around law enforcement access and reliance on third-party services may require further clarification.
|
||||
- **Comparison to Others**: Kagi differentiates itself from ad-based search engines (e.g., Google) by prioritizing privacy without compromising functionality.
|
||||
|
||||
In summary, Kagi Search is designed to protect user privacy through a combination of business model transparency, technical anonymity features, and strict data-minimization practices, making it a strong choice for users prioritizing confidentiality in their online activities.
|
||||
@@ -11,4 +11,5 @@ dependencies = [
|
||||
"python-dateutil>=2.9.0.post0",
|
||||
"python-dotenv>=1.1.0",
|
||||
"qwen-agent[code-interpreter]>=0.0.20",
|
||||
"rich>=13.7.0",
|
||||
]
|
||||
|
||||
@@ -1016,6 +1016,18 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "markdown-it-py"
|
||||
version = "3.0.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "mdurl" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "markupsafe"
|
||||
version = "3.0.2"
|
||||
@@ -1106,6 +1118,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mdurl"
|
||||
version = "0.1.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mistune"
|
||||
version = "3.1.3"
|
||||
@@ -1791,6 +1812,7 @@ dependencies = [
|
||||
{ name = "python-dateutil" },
|
||||
{ name = "python-dotenv" },
|
||||
{ name = "qwen-agent", extra = ["code-interpreter"] },
|
||||
{ name = "rich" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
@@ -1801,6 +1823,7 @@ requires-dist = [
|
||||
{ name = "python-dateutil", specifier = ">=2.9.0.post0" },
|
||||
{ name = "python-dotenv", specifier = ">=1.1.0" },
|
||||
{ name = "qwen-agent", extras = ["code-interpreter"], specifier = ">=0.0.20" },
|
||||
{ name = "rich", specifier = ">=13.7.0" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1875,6 +1898,19 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rich"
|
||||
version = "14.0.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "markdown-it-py" },
|
||||
{ name = "pygments" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rpds-py"
|
||||
version = "0.24.0"
|
||||
|
||||
Reference in New Issue
Block a user