trustgraph/docs/tech-specs/tool-services.sw.md

480 lines
15 KiB
Markdown
Raw Normal View History

---
layout: default
title: "Huduma za Zana: Zana za Wakala Zinazoweza Kuunganishwa Kwenye Mfumo"
parent: "Swahili (Beta)"
---
# Huduma za Zana: Zana za Wakala Zinazoweza Kuunganishwa Kwenye Mfumo
> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
## Hali
Imetekelezwa
## Muhtasari
Maelezo haya yanafafanua mfumo wa zana za wakala ambazo zinaweza kuunganishwa kwenye mfumo, zinazojulikana kama "huduma za zana". Tofauti na aina za zana zilizojumuishwa awali (`KnowledgeQueryImpl`, `McpToolImpl`, n.k.), huduma za zana huruhusu zana mpya kuletwa kwa:
1. Kuanzisha huduma mpya iliyojengwa kwenye Pulsar
2. Kuongeza maelezo ya usanidi ambayo huambia wakala jinsi ya kuiita
Hii inaruhusu uboreshaji bila kubadilisha mfumo msingi wa wakala.
## Dhana
| Neno | Ufafanuzi |
|------|------------|
| **Zana Iliyojumuishwa** | Aina za zana zilizopo zilizo na matumizi yaliyopangwa mapema katika `tools.py` |
| **Huduma ya Zana** | Huduma ya Pulsar ambayo inaweza kuita kama zana ya wakala, iliyoainishwa na maelezo ya huduma |
| **Zana** | Toleo lililosanidiwa ambalo linarejelea huduma ya zana, lililowezeshwa kwa wakala/LLM |
Hii ni mfumo wa tabaka mbili, sawa na zana za MCP:
MCP: Seva ya MCP inaainisha kiolesura cha zana → Usanidi wa zana huirejelea
Huduma za Zana: Huduma ya zana inaainisha kiolesura cha Pulsar → Usanidi wa zana huirejelea
## Asili: Zana Zilizopo
### Utendaji wa Zana Iliyojumuishwa
Zana kwa sasa zinafafanuliwa katika `trustgraph-flow/trustgraph/agent/react/tools.py` na matumizi yaliyopangwa:
```python
class KnowledgeQueryImpl:
async def invoke(self, question):
client = self.context("graph-rag-request")
return await client.rag(question, self.collection)
```
Kila aina ya zana:
Ina huduma ya Pulsar iliyopangwa tayari ambayo inaitumia (k.m., `graph-rag-request`)
Inajua njia sahihi ya kuita kwenye mteja (k.m., `client.rag()`)
Ina vigezo vilivyopangwa ambavyo vimefafuliwa katika utekelezaji
### Usajili wa Zana (service.py:105-214)
Zana huzamilishwa kutoka kwa usanidi na sehemu ya `type` ambayo inaelekeza kwenye utekelezaji:
```python
if impl_id == "knowledge-query":
impl = functools.partial(KnowledgeQueryImpl, collection=data.get("collection"))
elif impl_id == "text-completion":
impl = TextCompletionImpl
# ... etc
```
## Usanifu
### Mfumo wa Tabaka Mbili
#### Tabaka la 1: Kisajili cha Huduma ya Zana
Huduma ya zana inaelezea kiolesura cha huduma ya Pulsar. Inaangazia:
Mizinga ya Pulsar kwa ombi/jibu
Vigezo vya usanidi ambavyo vinahitajika na zana zinazotumia huduma hiyo
```json
{
"id": "custom-rag",
"request-queue": "non-persistent://tg/request/custom-rag",
"response-queue": "non-persistent://tg/response/custom-rag",
"config-params": [
{"name": "collection", "required": true}
]
}
```
Huduma ya zana ambayo haihitaji vigezo vya usanidi:
```json
{
"id": "calculator",
"request-queue": "non-persistent://tg/request/calc",
"response-queue": "non-persistent://tg/response/calc",
"config-params": []
}
```
#### Kategoria ya 2: Kisajili cha Zana
Zana inarejelea huduma ya zana na hutoa:
Maelezo ya vigezo ya usanidi (yakinayo na mahitaji ya huduma)
Meta-data ya zana kwa wakala (jina, maelezo)
Ufafanuzi wa hoja kwa mfumo wa lugha (LLM)
```json
{
"type": "tool-service",
"name": "query-customers",
"description": "Query the customer knowledge base",
"service": "custom-rag",
"collection": "customers",
"arguments": [
{
"name": "question",
"type": "string",
"description": "The question to ask about customers"
}
]
}
```
Zana nyingi zinaweza kurejelea huduma moja kwa usanidi tofauti:
```json
{
"type": "tool-service",
"name": "query-products",
"description": "Query the product knowledge base",
"service": "custom-rag",
"collection": "products",
"arguments": [
{
"name": "question",
"type": "string",
"description": "The question to ask about products"
}
]
}
```
### Muundo wa Ombi
Wakati zana inaitwa, ombi kwa huduma ya zana linajumuisha:
`user`: Kutoka ombi la wakala (utumiaji wa pamoja)
`config`: Maelezo ya usanidi yaliyokandwa katika umbizo la JSON kutoka kwa maelezo ya zana
`arguments`: Majadilisho yaliyokandwa katika umbizo la JSON kutoka kwa mfumo wa lugha kubwa (LLM)
```json
{
"user": "alice",
"config": "{\"collection\": \"customers\"}",
"arguments": "{\"question\": \"What are the top customer complaints?\"}"
}
```
Huduma ya zana hupokea haya kama dictionaries yaliyochanganishwa katika njia ya `invoke`.
### Utendakazi wa Huduma ya Zana ya Jumla
Darasa la `ToolServiceImpl` huita huduma za zana kulingana na usanidi:
```python
class ToolServiceImpl:
def __init__(self, context, request_queue, response_queue, config_values, arguments, processor):
self.request_queue = request_queue
self.response_queue = response_queue
self.config_values = config_values # e.g., {"collection": "customers"}
# ...
async def invoke(self, **arguments):
client = await self._get_or_create_client()
response = await client.call(user, self.config_values, arguments)
if isinstance(response, str):
return response
else:
return json.dumps(response)
```
## Maamuzi ya Ubunifu
### Mfumo wa Uwekaji wa Tabaka Mbili
Huduma za zana zinafuata mfumo wa tabaka mbili, sawa na zana za MCP:
1. **Huduma ya Zana**: Inaelezea kiolesura cha huduma ya Pulsar (mada, vigezo muhimu vya usanidi)
2. **Zana**: Inarejelea huduma ya zana, hutoa maadili ya usanidi, inaelezea hoja za LLM
Tofauti hii inaruhusu:
Huduma moja ya zana kutumika na zana nyingi zenye usanidi tofauti
Tofauti wazi kati ya kiolesura cha huduma na usanidi wa zana
Ujuzi wa matumizi wa maelezo ya huduma
### Ramani ya Ombi: Kupitisha na Kifurushi
Ombi kwa huduma ya zana ni kifurushi kilicho na muundo, kinachojumuisha:
`user`: Inasambazwa kutoka ombi la wakala kwa ajili ya utumiaji wa pamoja
Maadili ya usanidi: Kutoka kwa maelezo ya zana (k.m., `collection`)
`arguments`: Hoja zilizotolewa na LLM, zinazopitishwa kama kamusi
Kidhibiti cha wakala huchanganua jibu la LLM kuwa `act.arguments` kama kamusi (`agent_manager.py:117-154`). Kamusi hii inajumuishwa katika kifurushi cha ombi.
### Usimamizi wa Mpango: Bila Aina
Maombi na majibu hutumia kamusi zisizo na aina. Hakuna uthibitishaji wa mpango katika ngazi ya wakala - huduma ya zana inawajibika kwa uthibitishaji wa pembejeo zake. Hii hutoa uwezo mkubwa wa kufafanua huduma mpya.
### Kiolesura cha Mteja: Mada za Moja kwa Moja za Pulsar
Huduma za zana hutumia mada za moja kwa moja za Pulsar bila kuhitaji usanidi wa mtiririko. Maelezo ya huduma-ya-zana yanaelezea majina kamili ya folyo:
```json
{
"id": "joke-service",
"request-queue": "non-persistent://tg/request/joke",
"response-queue": "non-persistent://tg/response/joke",
"config-params": [...]
}
```
Hii inaruhusu huduma kuwa zimepakwa kwenye nafasi yoyote.
### Usimamizi wa Makosa: Mfumo wa Makosa wa Kawaida
Majibu ya huduma ya zana yanafuata mfumo wa sasa wa muundo na sehemu ya `error`:
```python
@dataclass
class Error:
type: str = ""
message: str = ""
```
Muundo wa majibu:
Mafanikio: `error` ni `None`, majibu yana matokeo
Kosa: `error` imejaa na `type` na `message`
Hii inafanana na muundo uliotumika katika huduma zingine (e.g., `PromptResponse`, `QueryResponse`, `AgentResponse`).
### Uhusiano wa Ombi/Jibu
Maombi na majibu yanahusishwa kwa kutumia `id` katika vipengele vya ujumbe wa Pulsar:
Ombi linajumuisha `id` katika vipengele: `properties={"id": id}`
Majibu (mengi) yanajumuisha `id` sawa: `properties={"id": id}`
Hii inafuata muundo uliopo katika codebase (e.g., `agent_service.py`, `llm_service.py`).
### Usaidizi wa Uhamaji (Streaming)
Huduma za zana zinaweza kurejesha majibu ya uhamaji:
Ujumbe mwingi wa majibu wenye `id` sawa katika vipengele
Kila jibu linajumuisha `end_of_stream: bool`
Jibu la mwisho lina `end_of_stream: True`
Hii inafanana na muundo uliotumika katika `AgentResponse` na huduma zingine za uhamaji.
### Usimamizi wa Majibu: Kurudisha Kamba (String)
Zana zote zilizopo zinafuata muundo huo: **kupokea hoja kama orodha, kurejesha matokeo kama kamba**.
| Zana | Usimamizi wa Majibu |
|------|------------------|
| `KnowledgeQueryImpl` | Inarejea `client.rag()` moja kwa moja (kamba) |
| `TextCompletionImpl` | Inarejea `client.question()` moja kwa moja (kamba) |
| `McpToolImpl` | Inarejea kamba, au `json.dumps(output)` ikiwa si kamba |
| `StructuredQueryImpl` | Inaweka matokeo katika kamba |
| `PromptImpl` | Inarejea `client.prompt()` moja kwa moja (kamba) |
Huduma za zana zinafuata mkataba huo:
Huduma inarejea jibu la kamba (matokeo)
Ikiwa jibu si kamba, linabadilishwa kupitia `json.dumps()`
Hakuna usanidi wa uondoaji unaohitajika katika maelezo
Hii huweka maelezo kuwa rahisi na kuweka jukumu kwa huduma kurejesha jibu la maandishi linalofaa kwa wakala.
## Mwongozo wa Usanidi
Ili kuongeza huduma mpya ya zana, vipengele viwili vya usanidi vinahitajika:
### 1. Usanidi wa Huduma ya Zana
Inahifadhiwa chini ya ufunguo wa usanidi `tool-service`. Inaelezea folyo za Pulsar na vigezo vinavyopatikana vya usanidi.
| Uwanja | Inahitajika | Maelezo |
|-------|----------|-------------|
| `id` | Ndiyo | Kitambulisho cha kipekee kwa huduma ya zana |
| `request-queue` | Ndiyo | Mada kamili ya Pulsar kwa maombi (e.g., `non-persistent://tg/request/joke`) |
| `response-queue` | Ndiyo | Mada kamili ya Pulsar kwa majibu (e.g., `non-persistent://tg/response/joke`) |
| `config-params` | Hapana | Safu ya vigezo vya usanidi ambavyo huduma inakubali |
Kila kiparamu cha usanidi kinaweza kuainisha:
`name`: Jina la kiparamu (inahitajika)
`required`: Ikiwa kiparamu lazima kipewe na zana (cha kawaida: bandia)
Mfano:
```json
{
"id": "joke-service",
"request-queue": "non-persistent://tg/request/joke",
"response-queue": "non-persistent://tg/response/joke",
"config-params": [
{"name": "style", "required": false}
]
}
```
### 2. Usanidi wa Zana
Hifadhiwa chini ya ufunguo wa `tool`. Inaelezea zana ambayo wakala anaweza kutumia.
| Sehemu | Inahitajika | Maelezo |
|-------|----------|-------------|
| `type` | Ndiyo | Lazima iwe `"tool-service"` |
| `name` | Ndiyo | Jina la zana linaloonyeshwa kwa LLM |
| `description` | Ndiyo | Maelezo ya kile ambacho zana inafanya (yanaonyeshwa kwa LLM) |
| `service` | Ndiyo | Kitambulisho cha huduma ya zana inayotumiwa |
| `arguments` | Hapana | Safu ya maelezo ya hoja kwa ajili ya LLM |
| *(vigezo vya usanidi)* | Hubadilika | Vigezo vyovyote vya usanidi vilivyobainishwa na huduma |
Kila hoja inaweza kubainisha:
`name`: Jina la hoja (inahitajika)
`type`: Aina ya data, kwa mfano, `"string"` (inahitajika)
`description`: Maelezo yanayoonyeshwa kwa LLM (inahitajika)
Mfano:
```json
{
"type": "tool-service",
"name": "tell-joke",
"description": "Tell a joke on a given topic",
"service": "joke-service",
"style": "pun",
"arguments": [
{
"name": "topic",
"type": "string",
"description": "The topic for the joke (e.g., programming, animals, food)"
}
]
}
```
### Upakiaji wa Mipangilio
Tumia `tg-put-config-item` ili kupakia mipangilio:
```bash
# Load tool-service config
tg-put-config-item tool-service/joke-service < joke-service.json
# Load tool config
tg-put-config-item tool/tell-joke < tell-joke.json
```
Wakala-mtawala lazima uanzishwe tena ili kuchukua usanidi mpya.
## Maelezo ya Utendaji
### Mpango
Aina za ombi na majibu katika `trustgraph-base/trustgraph/schema/services/tool_service.py`:
```python
@dataclass
class ToolServiceRequest:
user: str = "" # User context for multi-tenancy
config: str = "" # JSON-encoded config values from tool descriptor
arguments: str = "" # JSON-encoded arguments from LLM
@dataclass
class ToolServiceResponse:
error: Error | None = None
response: str = "" # String response (the observation)
end_of_stream: bool = False
```
### Upande wa Server: Huduma ya DynamicToolService
Darasa la msingi katika `trustgraph-base/trustgraph/base/dynamic_tool_service.py`:
```python
class DynamicToolService(AsyncProcessor):
"""Base class for implementing tool services."""
def __init__(self, **params):
topic = params.get("topic", default_topic)
# Constructs topics: non-persistent://tg/request/{topic}, non-persistent://tg/response/{topic}
# Sets up Consumer and Producer
async def invoke(self, user, config, arguments):
"""Override this method to implement the tool's logic."""
raise NotImplementedError()
```
### Upande wa Mteja: Huduma ya ToolServiceImpl
Utendaji katika `trustgraph-flow/trustgraph/agent/react/tools.py`:
```python
class ToolServiceImpl:
def __init__(self, context, request_queue, response_queue, config_values, arguments, processor):
# Uses the provided queue paths directly
# Creates ToolServiceClient on first use
async def invoke(self, **arguments):
client = await self._get_or_create_client()
response = await client.call(user, config_values, arguments)
return response if isinstance(response, str) else json.dumps(response)
```
### Faili
| Faili | Madhumuni |
|------|---------|
| `trustgraph-base/trustgraph/schema/services/tool_service.py` | Mifumo ya ombi/jibu |
| `trustgraph-base/trustgraph/base/tool_service_client.py` | Mteja wa kutumia huduma |
| `trustgraph-base/trustgraph/base/dynamic_tool_service.py` | Darasa la msingi kwa utekelezaji wa huduma |
| `trustgraph-flow/trustgraph/agent/react/tools.py` | Darasa la `ToolServiceImpl` |
| `trustgraph-flow/trustgraph/agent/react/service.py` | Kupakia usanidi |
### Mifano: Huduma ya Utani
Mfano wa huduma katika `trustgraph-flow/trustgraph/tool_service/joke/`:
```python
class Processor(DynamicToolService):
async def invoke(self, user, config, arguments):
style = config.get("style", "pun")
topic = arguments.get("topic", "")
joke = pick_joke(topic, style)
return f"Hey {user}! Here's a {style} for you:\n\n{joke}"
```
Usanidi wa huduma za zana:
```json
{
"id": "joke-service",
"request-queue": "non-persistent://tg/request/joke",
"response-queue": "non-persistent://tg/response/joke",
"config-params": [{"name": "style", "required": false}]
}
```
Usanidi wa zana:
```json
{
"type": "tool-service",
"name": "tell-joke",
"description": "Tell a joke on a given topic",
"service": "joke-service",
"style": "pun",
"arguments": [
{"name": "topic", "type": "string", "description": "The topic for the joke"}
]
}
```
### Ulinganishi na Matoleo ya Zamani
Aina za zana zilizopo zilizojumuishwa zinaendelea kufanya kazi bila kubadilishwa.
`tool-service` ni aina mpya ya zana pamoja na aina zilizopo (`knowledge-query`, `mcp-tool`, n.k.).
## Mambo ya Kuzingatia Baadaye
### Huduma Zinajitangaza Zenyewe
Uboreshaji wa siku zijazo unaweza kuruhusu huduma kuchapisha maelezo yao wenyewe:
Huduma huchapisha kwenye mada iliyojulikana ya `tool-descriptors` wakati wa kuanza.
Wakala husajili na kusajili zana kwa njia ya moja kwa moja.
Inaruhusu uunganishaji halisi wa "plug-and-play" bila mabadiliko ya usanidi.
Hii ni nje ya upeo wa utekelezaji wa awali.
## Marejeleo
Utaratibu wa sasa wa zana: `trustgraph-flow/trustgraph/agent/react/tools.py`
Usajili wa zana: `trustgraph-flow/trustgraph/agent/react/service.py:105-214`
Schemas za wakala: `trustgraph-base/trustgraph/schema/services/agent.py`