Local Copilot as a Service wrapper with CLI and REST APIs.
Project description
copilot-service
copilot-service provides a stable local CLI and REST wrapper around Copilot/LLM CLI tooling so scripts and agents can call a normalized task API.
What problem this solves
Different LLM CLIs have different prompt formats and output styles. This project gives one stable contract for task-based calls (route-topic, freeform) and isolates provider setup in local config.
Releases
Automated releases are available through GitHub Actions. See docs/release.md for full instructions.
Python client
from copilot_service.client import CopilotServiceClient
client = CopilotServiceClient() # connects to http://127.0.0.1:8765
result = client.freeform("Explain this error")
if result.ok:
print(result.content["text"])
result = client.route_topic(
title="Article title",
message="Full message",
article_excerpt="...",
topics={"asr": "Speech Recognition", "nlp": "NLP"},
)
print(result.content["decision"])
See docs/api-contract.md for the full API contract.
CLI UX
Running copilot-caas with no arguments shows a colorful welcome screen and exits 0:
copilot-caas
Check the installed version:
copilot-caas --version
Run a task:
copilot-caas ask --input examples/route-topic-request.json
Colors are automatically disabled when NO_COLOR is set or output is not a TTY.
Quickstart (fake provider)
python -m venv .venv
. .venv/bin/activate
pip install -e .
export COPILOT_SERVICE_PROVIDER=fake
export COPILOT_SERVICE_FAKE_RESPONSE='{"decision":"asr","confidence":0.8,"reason":"fake"}'
copilot-service ask --input examples/route-topic-request.json
Quickstart (shell provider)
export COPILOT_SERVICE_PROVIDER=shell
export COPILOT_SERVICE_SHELL_COMMAND='python -c "import sys; print(sys.stdin.read())"'
copilot-service ask --task freeform --prompt "Explain this"
REST usage
copilot-service serve --host 127.0.0.1 --port 8765
curl -sS http://127.0.0.1:8765/health
curl -sS http://127.0.0.1:8765/v1/ask \
-H 'content-type: application/json' \
--data @examples/freeform-request.json
curl -sS http://127.0.0.1:8765/v1/tasks/route-topic \
-H 'content-type: application/json' \
--data @examples/route-topic-request.json
Article-ingestion integration example
See examples/article-ingestion-usage.sh for a simple pipeline wrapper around the route-topic task.
Environment
COPILOT_SERVICE_PROVIDER(shellfor MVP,fakefor tests)COPILOT_SERVICE_SHELL_COMMAND(provider command)COPILOT_SERVICE_MODEL(defaultgpt-5-mini)COPILOT_SERVICE_TIMEOUT_SECONDS(default90)COPILOT_SERVICE_HOST(default127.0.0.1)COPILOT_SERVICE_PORT(default8765)
Limitations
- MVP ships only with shell/fake providers.
- Output quality depends on your configured local command and prompt discipline.
route-topicfallback behavior can mask model errors when enabled (default true).
Security note
REST binds to 127.0.0.1 by default. The shell command is loaded only from local environment/config (never from request payload).
Debug systemd service
If the service is installed via scripts/install-systemd-user.sh and requests fail, use these commands to diagnose.
Check the env file written by the installer:
cat ~/.config/copilot-service/env
Check service status:
systemctl --user status copilot-service.service --no-pager
Tail recent logs:
journalctl --user -u copilot-service.service -n 120 --no-pager
Show unit configuration (env file path and ExecStart):
systemctl --user show copilot-service.service -p EnvironmentFiles -p ExecStart
Health check:
curl -s http://127.0.0.1:8765/health | jq .
Route-topic API call:
curl -s http://127.0.0.1:8765/v1/tasks/route-topic \
-H 'Content-Type: application/json' \
--data-binary @/tmp/route-topic-request.json | jq .
Direct provider check (replace /path/to/copilot with the value of COPILOT_SERVICE_SHELL_COMMAND in the env file):
/path/to/copilot \
-p 'Return only this exact JSON and nothing else: {"ok":true}' \
--model gpt-5-mini \
--silent \
--no-color \
--no-auto-update \
--stream off \
--no-custom-instructions \
--no-ask-user \
--available-tools=
Expected output (the leading ● bullet is stripped automatically by the JSON extractor):
● {"ok":true}
Shell provider modes (COPILOT_SERVICE_SHELL_MODE):
| Value | Behavior |
|---|---|
argv |
Prompt passed via -p flag; uses shell=False. Required for GitHub Copilot CLI. |
stdin |
Prompt piped to subprocess stdin; uses shell=True. Original default. |
| `` (empty) | Same as stdin — backward-compatible default. |
The installer sets COPILOT_SERVICE_SHELL_MODE=argv automatically.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file copilot_caas-1.0.0.tar.gz.
File metadata
- Download URL: copilot_caas-1.0.0.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
164f512145a91f7bd6c47d80e2266454db62fdfe1a4f601e5cea2cb53ff1d87e
|
|
| MD5 |
2f18b02f137cd5de89cfd4ca46f0212f
|
|
| BLAKE2b-256 |
5d2e9ddb9eb4c3bbbeb4776262cc146000617904366e24cecd94e6c5f3102986
|
Provenance
The following attestation bundles were made for copilot_caas-1.0.0.tar.gz:
Publisher:
publish.yml on tiroq/copilot-service
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
copilot_caas-1.0.0.tar.gz -
Subject digest:
164f512145a91f7bd6c47d80e2266454db62fdfe1a4f601e5cea2cb53ff1d87e - Sigstore transparency entry: 1475939837
- Sigstore integration time:
-
Permalink:
tiroq/copilot-service@665a53ac15627b0ced78cf9c958d5b6099f34085 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/tiroq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@665a53ac15627b0ced78cf9c958d5b6099f34085 -
Trigger Event:
push
-
Statement type:
File details
Details for the file copilot_caas-1.0.0-py3-none-any.whl.
File metadata
- Download URL: copilot_caas-1.0.0-py3-none-any.whl
- Upload date:
- Size: 19.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4036a2b6e12eb93c084d95f4a1cb629d79d112c81dde6fb272ecca915964f482
|
|
| MD5 |
e287dfaa3e5ca6f53009ec0f4b96bc23
|
|
| BLAKE2b-256 |
1229825851f34c8b78204b243f41a2edeb9937675dec17bc20881341457d137b
|
Provenance
The following attestation bundles were made for copilot_caas-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on tiroq/copilot-service
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
copilot_caas-1.0.0-py3-none-any.whl -
Subject digest:
4036a2b6e12eb93c084d95f4a1cb629d79d112c81dde6fb272ecca915964f482 - Sigstore transparency entry: 1475940010
- Sigstore integration time:
-
Permalink:
tiroq/copilot-service@665a53ac15627b0ced78cf9c958d5b6099f34085 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/tiroq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@665a53ac15627b0ced78cf9c958d5b6099f34085 -
Trigger Event:
push
-
Statement type: